From e86f30845d2e5ac9be7363a85f12c4ce88b121d8 Mon Sep 17 00:00:00 2001 From: AAAlvesJr <aalvesju@gmail.com> Date: Fri, 26 Feb 2021 10:20:12 +0100 Subject: [PATCH] first commit --- CMakeLists.txt | 78 + catch/catch.hpp | 17877 +++++++++++ cmake/AddExample.cmake | 18 + cmake/FindRandomIterator.cmake | 87 + cmake/FindTCLAP.cmake | 35 + cmake/FindTestU01.cmake | 118 + random_iterator/Engine.hpp | 223 + random_iterator/RandomIterator.h | 81 + random_iterator/Stream.hpp | 148 + random_iterator/detail/EngineTraits.hpp | 115 + .../detail/Random123/MicroURNG.hpp | 146 + .../detail/Random123/ReinterpretCtr.hpp | 88 + random_iterator/detail/Random123/aes.h | 398 + random_iterator/detail/Random123/array.h | 348 + random_iterator/detail/Random123/ars.h | 204 + .../detail/Random123/boxmuller.hpp | 139 + .../detail/Random123/conventional/Engine.hpp | 276 + .../detail/Random123/conventional/gsl_cbrng.h | 128 + .../detail/Random123/features/clangfeatures.h | 93 + .../Random123/features/compilerfeatures.h | 343 + .../detail/Random123/features/gccfeatures.h | 263 + .../detail/Random123/features/iccfeatures.h | 212 + .../detail/Random123/features/metalfeatures.h | 111 + .../detail/Random123/features/msvcfeatures.h | 200 + .../detail/Random123/features/nvccfeatures.h | 125 + .../Random123/features/open64features.h | 50 + .../Random123/features/openclfeatures.h | 89 + .../detail/Random123/features/pgccfeatures.h | 194 + .../detail/Random123/features/sse.h | 280 + .../Random123/features/sunprofeatures.h | 172 + .../detail/Random123/features/xlcfeatures.h | 210 + .../detail/Random123/gsl_microrng.h | 136 + random_iterator/detail/Random123/philox.h | 493 + random_iterator/detail/Random123/threefry.h | 870 + random_iterator/detail/Random123/u01fixedpt.h | 200 + random_iterator/detail/Random123/uniform.hpp | 312 + random_iterator/detail/SplitMix.hpp | 57 + random_iterator/detail/Squares3.hpp | 149 + random_iterator/detail/Squares4.hpp | 130 + random_iterator/detail/SquaresKeys.hpp | 25057 ++++++++++++++++ .../detail/functors/EngineCaller.hpp | 91 + .../detail/tbb/internal/_tbb_windef.h | 69 + .../detail/tbb/internal/_template_helpers.h | 311 + random_iterator/detail/tbb/iterators.h | 326 + random_iterator/detail/tbb/tbb_config.h | 873 + random_iterator/detail/tbb/tbb_stddef.h | 565 + tests/CMakeLists.txt | 32 + tests/benchmark_engine.cpp | 292 + tests/benchmark_stream.cpp | 170 + tests/testing.cpp | 296 + 50 files changed, 53278 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 catch/catch.hpp create mode 100644 cmake/AddExample.cmake create mode 100644 cmake/FindRandomIterator.cmake create mode 100644 cmake/FindTCLAP.cmake create mode 100644 cmake/FindTestU01.cmake create mode 100644 random_iterator/Engine.hpp create mode 100644 random_iterator/RandomIterator.h create mode 100644 random_iterator/Stream.hpp create mode 100644 random_iterator/detail/EngineTraits.hpp create mode 100644 random_iterator/detail/Random123/MicroURNG.hpp create mode 100644 random_iterator/detail/Random123/ReinterpretCtr.hpp create mode 100644 random_iterator/detail/Random123/aes.h create mode 100644 random_iterator/detail/Random123/array.h create mode 100644 random_iterator/detail/Random123/ars.h create mode 100644 random_iterator/detail/Random123/boxmuller.hpp create mode 100644 random_iterator/detail/Random123/conventional/Engine.hpp create mode 100644 random_iterator/detail/Random123/conventional/gsl_cbrng.h create mode 100644 random_iterator/detail/Random123/features/clangfeatures.h create mode 100644 random_iterator/detail/Random123/features/compilerfeatures.h create mode 100644 random_iterator/detail/Random123/features/gccfeatures.h create mode 100644 random_iterator/detail/Random123/features/iccfeatures.h create mode 100644 random_iterator/detail/Random123/features/metalfeatures.h create mode 100644 random_iterator/detail/Random123/features/msvcfeatures.h create mode 100644 random_iterator/detail/Random123/features/nvccfeatures.h create mode 100644 random_iterator/detail/Random123/features/open64features.h create mode 100644 random_iterator/detail/Random123/features/openclfeatures.h create mode 100644 random_iterator/detail/Random123/features/pgccfeatures.h create mode 100644 random_iterator/detail/Random123/features/sse.h create mode 100644 random_iterator/detail/Random123/features/sunprofeatures.h create mode 100644 random_iterator/detail/Random123/features/xlcfeatures.h create mode 100644 random_iterator/detail/Random123/gsl_microrng.h create mode 100644 random_iterator/detail/Random123/philox.h create mode 100644 random_iterator/detail/Random123/threefry.h create mode 100644 random_iterator/detail/Random123/u01fixedpt.h create mode 100644 random_iterator/detail/Random123/uniform.hpp create mode 100644 random_iterator/detail/SplitMix.hpp create mode 100644 random_iterator/detail/Squares3.hpp create mode 100644 random_iterator/detail/Squares4.hpp create mode 100644 random_iterator/detail/SquaresKeys.hpp create mode 100644 random_iterator/detail/functors/EngineCaller.hpp create mode 100644 random_iterator/detail/tbb/internal/_tbb_windef.h create mode 100644 random_iterator/detail/tbb/internal/_template_helpers.h create mode 100644 random_iterator/detail/tbb/iterators.h create mode 100644 random_iterator/detail/tbb/tbb_config.h create mode 100644 random_iterator/detail/tbb/tbb_stddef.h create mode 100644 tests/CMakeLists.txt create mode 100644 tests/benchmark_engine.cpp create mode 100644 tests/benchmark_stream.cpp create mode 100644 tests/testing.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..8a75380 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,78 @@ +### CMakeList for RandomIterator examples and documentation + +cmake_minimum_required(VERSION 3.2) + +# project name +project(RandomIterator) + +# warn user if system is not UNIX +if(NOT UNIX) + message(FATAL_ERROR "This is an unsupported system.") +endif() + +#cmake path dir +SET(RANDOMITERATOR_CMAKE_DIR "${PROJECT_SOURCE_DIR}/cmake") +SET(CMAKE_MODULE_PATH "${RANDOMITERATOR_CMAKE_DIR}" ${CMAKE_MODULE_PATH}) +SET(CMAKE_VERBOSE_MAKEFILE ON) + +#check if compiler is C++17 compliant +include(CheckCXXCompilerFlag) +CHECK_CXX_COMPILER_FLAG("--std=c++17" COMPILER_SUPPORTS_CXX17) +if(NOT COMPILER_SUPPORTS_CXX17) + message(FATAL "The compiler ${CMAKE_CXX_COMPILER} has no C++17 support. Please use a different C++ compiler.") +endif() + +#compiler flags +if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + + MESSAGE(STATUS "Setting Clang flags") + set(CMAKE_CXX_FLAGS " --std=c++17 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE) + +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + + MESSAGE(STATUS "Setting GCC flags") + set(CMAKE_CXX_FLAGS " --std=c++17 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE) + +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") + + MESSAGE(STATUS "Setting ICC flags") + set(CMAKE_CXX_FLAGS " --std=c++17 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE) + +endif() + +#----------------------- +# get RandomIterator +find_package(RandomIterator REQUIRED) +include_directories(${RandomIterator_INCLUDE_DIR}) + +#----------------------- +# get TCLAP +find_package(TCLAP REQUIRED) +if(TCLAP_FOUND) +include_directories(${TCLAP_INCLUDE_DIR}) +endif(TCLAP_FOUND) + +set(CATCH_HEADER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/catch) + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories( ${CATCH_HEADER_DIR}) + +#+++++++++++++++++++++++++++ +# EXAMPLES + +#+++++++++++++++++++++++++++ + + +add_custom_target(examples) +include(${RANDOMITERATOR_CMAKE_DIR}/AddExample.cmake) + +#add_subdirectory(examples/) + +#+++++++++++++++++++++++++++ +# TESTING + +#+++++++++++++++++++++++++++ +enable_testing() + +add_custom_target(tests) +add_subdirectory(tests) + + diff --git a/catch/catch.hpp b/catch/catch.hpp new file mode 100644 index 0000000..2a2d77a --- /dev/null +++ b/catch/catch.hpp @@ -0,0 +1,17877 @@ +/* + * Catch v2.13.3 + * Generated: 2020-10-31 18:20:31.045274 + * ---------------------------------------------------------- + * This file has been merged from multiple headers. Please don't edit it directly + * Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED +#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED +// start catch.hpp + + +#define CATCH_VERSION_MAJOR 2 +#define CATCH_VERSION_MINOR 13 +#define CATCH_VERSION_PATCH 3 + +#ifdef __clang__ +# pragma clang system_header +#elif defined __GNUC__ +# pragma GCC system_header +#endif + +// start catch_suppress_warnings.h + +#ifdef __clang__ +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(push) +# pragma warning(disable: 161 1682) +# else // __ICC +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wpadded" +# pragma clang diagnostic ignored "-Wswitch-enum" +# pragma clang diagnostic ignored "-Wcovered-switch-default" +# endif +#elif defined __GNUC__ + // Because REQUIREs trigger GCC's -Wparentheses, and because still + // supported version of g++ have only buggy support for _Pragmas, + // Wparentheses have to be suppressed globally. +# pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-variable" +# pragma GCC diagnostic ignored "-Wpadded" +#endif +// end catch_suppress_warnings.h +#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) +# define CATCH_IMPL +# define CATCH_CONFIG_ALL_PARTS +#endif + +// In the impl file, we want to have access to all parts of the headers +// Can also be used to sanely support PCHs +#if defined(CATCH_CONFIG_ALL_PARTS) +# define CATCH_CONFIG_EXTERNAL_INTERFACES +# if defined(CATCH_CONFIG_DISABLE_MATCHERS) +# undef CATCH_CONFIG_DISABLE_MATCHERS +# endif +# if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) +# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER +# endif +#endif + +#if !defined(CATCH_CONFIG_IMPL_ONLY) +// start catch_platform.h + +#ifdef __APPLE__ +# include <TargetConditionals.h> +# if TARGET_OS_OSX == 1 +# define CATCH_PLATFORM_MAC +# elif TARGET_OS_IPHONE == 1 +# define CATCH_PLATFORM_IPHONE +# endif + +#elif defined(linux) || defined(__linux) || defined(__linux__) +# define CATCH_PLATFORM_LINUX + +#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__) +# define CATCH_PLATFORM_WINDOWS +#endif + +// end catch_platform.h + +#ifdef CATCH_IMPL +# ifndef CLARA_CONFIG_MAIN +# define CLARA_CONFIG_MAIN_NOT_DEFINED +# define CLARA_CONFIG_MAIN +# endif +#endif + +// start catch_user_interfaces.h + +namespace Catch { + unsigned int rngSeed(); +} + +// end catch_user_interfaces.h +// start catch_tag_alias_autoregistrar.h + +// start catch_common.h + +// start catch_compiler_capabilities.h + +// Detect a number of compiler features - by compiler +// The following features are defined: +// +// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? +// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? +// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? +// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled? +// **************** +// Note to maintainers: if new toggles are added please document them +// in configuration.md, too +// **************** + +// In general each macro has a _NO_<feature name> form +// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature. +// Many features, at point of detection, define an _INTERNAL_ macro, so they +// can be combined, en-mass, with the _NO_ forms later. + +#ifdef __cplusplus + +# if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) +# define CATCH_CPP14_OR_GREATER +# endif + +# if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define CATCH_CPP17_OR_GREATER +# endif + +#endif + +// We have to avoid both ICC and Clang, because they try to mask themselves +// as gcc, and we want only GCC in this block +#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) + +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) + +#endif + +#if defined(__clang__) + +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" ) + +// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug +// which results in calls to destructors being emitted for each temporary, +// without a matching initialization. In practice, this can result in something +// like `std::string::~string` being called on an uninitialized value. +// +// For example, this code will likely segfault under IBM XL: +// ``` +// REQUIRE(std::string("12") + "34" == "1234") +// ``` +// +// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. +# if !defined(__ibmxl__) && !defined(__CUDACC__) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */ +# endif + +# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ + _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") + +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) + +# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) + +# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) + +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-template\"" ) + +#endif // __clang__ + +//////////////////////////////////////////////////////////////////////////////// +// Assume that non-Windows platforms support posix signals by default +#if !defined(CATCH_PLATFORM_WINDOWS) + #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS +#endif + +//////////////////////////////////////////////////////////////////////////////// +// We know some environments not to support full POSIX signals +#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__) + #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +#endif + +#ifdef __OS400__ +# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +# define CATCH_CONFIG_COLOUR_NONE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Android somehow still does not support std::to_string +#if defined(__ANDROID__) +# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING +# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Not all Windows environments support SEH properly +#if defined(__MINGW32__) +# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH +#endif + +//////////////////////////////////////////////////////////////////////////////// +// PS4 +#if defined(__ORBIS__) +# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Cygwin +#ifdef __CYGWIN__ + +// Required for some versions of Cygwin to declare gettimeofday +// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin +# define _BSD_SOURCE +// some versions of cygwin (most) do not support std::to_string. Use the libstd check. +// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813 +# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ + && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) + +# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING + +# endif +#endif // __CYGWIN__ + +//////////////////////////////////////////////////////////////////////////////// +// Visual C++ +#if defined(_MSC_VER) + +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) + +// Universal Windows platform does not support SEH +// Or console colours (or console at all...) +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define CATCH_CONFIG_COLOUR_NONE +# else +# define CATCH_INTERNAL_CONFIG_WINDOWS_SEH +# endif + +// MSVC traditional preprocessor needs some workaround for __VA_ARGS__ +// _MSVC_TRADITIONAL == 0 means new conformant preprocessor +// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor +# if !defined(__clang__) // Handle Clang masquerading for msvc +# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) +# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +# endif // MSVC_TRADITIONAL +# endif // __clang__ + +#endif // _MSC_VER + +#if defined(_REENTRANT) || defined(_MSC_VER) +// Enable async processing, as -pthread is specified or no additional linking is required +# define CATCH_INTERNAL_CONFIG_USE_ASYNC +#endif // _MSC_VER + +//////////////////////////////////////////////////////////////////////////////// +// Check if we are compiled with -fno-exceptions or equivalent +#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) +# define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED +#endif + +//////////////////////////////////////////////////////////////////////////////// +// DJGPP +#ifdef __DJGPP__ +# define CATCH_INTERNAL_CONFIG_NO_WCHAR +#endif // __DJGPP__ + +//////////////////////////////////////////////////////////////////////////////// +// Embarcadero C++Build +#if defined(__BORLANDC__) + #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN +#endif + +//////////////////////////////////////////////////////////////////////////////// + +// Use of __COUNTER__ is suppressed during code analysis in +// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly +// handled by it. +// Otherwise all supported compilers support COUNTER macro, +// but user still might want to turn it off +#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) + #define CATCH_INTERNAL_CONFIG_COUNTER +#endif + +//////////////////////////////////////////////////////////////////////////////// + +// RTX is a special version of Windows that is real time. +// This means that it is detected as Windows, but does not provide +// the same set of capabilities as real Windows does. +#if defined(UNDER_RTSS) || defined(RTX64_BUILD) + #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH + #define CATCH_INTERNAL_CONFIG_NO_ASYNC + #define CATCH_CONFIG_COLOUR_NONE +#endif + +#if !defined(_GLIBCXX_USE_C99_MATH_TR1) +#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER +#endif + +// Various stdlib support checks that require __has_include +#if defined(__has_include) + // Check if string_view is available and usable + #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW + #endif + + // Check if optional is available and usable + # if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL + # endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) + + // Check if byte is available and usable + # if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) + # include <cstddef> + # if __cpp_lib_byte > 0 + # define CATCH_INTERNAL_CONFIG_CPP17_BYTE + # endif + # endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) + + // Check if variant is available and usable + # if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) + # if defined(__clang__) && (__clang_major__ < 8) + // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 + // fix should be in clang 8, workaround in libstdc++ 8.2 + # include <ciso646> + # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # define CATCH_CONFIG_NO_CPP17_VARIANT + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__clang__) && (__clang_major__ < 8) + # endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) +#endif // defined(__has_include) + +#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) +# define CATCH_CONFIG_COUNTER +#endif +#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH) +# define CATCH_CONFIG_WINDOWS_SEH +#endif +// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. +#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) +# define CATCH_CONFIG_POSIX_SIGNALS +#endif +// This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions. +#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR) +# define CATCH_CONFIG_WCHAR +#endif + +#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING) +# define CATCH_CONFIG_CPP11_TO_STRING +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL) +# define CATCH_CONFIG_CPP17_OPTIONAL +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) +# define CATCH_CONFIG_CPP17_STRING_VIEW +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT) +# define CATCH_CONFIG_CPP17_VARIANT +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE) +# define CATCH_CONFIG_CPP17_BYTE +#endif + +#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) +# define CATCH_INTERNAL_CONFIG_NEW_CAPTURE +#endif + +#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE) +# define CATCH_CONFIG_NEW_CAPTURE +#endif + +#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) +# define CATCH_CONFIG_DISABLE_EXCEPTIONS +#endif + +#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN) +# define CATCH_CONFIG_POLYFILL_ISNAN +#endif + +#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC) +# define CATCH_CONFIG_USE_ASYNC +#endif + +#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE) +# define CATCH_CONFIG_ANDROID_LOGWRITE +#endif + +#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) +# define CATCH_CONFIG_GLOBAL_NEXTAFTER +#endif + +// Even if we do not think the compiler has that warning, we still have +// to provide a macro that can be used by the code. +#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION +#endif +#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS +#endif + +// The goal of this macro is to avoid evaluation of the arguments, but +// still have the compiler warn on problems inside... +#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) +#endif + +#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#elif defined(__clang__) && (__clang_major__ < 5) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#endif + +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) +#define CATCH_TRY if ((true)) +#define CATCH_CATCH_ALL if ((false)) +#define CATCH_CATCH_ANON(type) if ((false)) +#else +#define CATCH_TRY try +#define CATCH_CATCH_ALL catch (...) +#define CATCH_CATCH_ANON(type) catch (type) +#endif + +#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) +#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#endif + +// end catch_compiler_capabilities.h +#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line +#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) +#ifdef CATCH_CONFIG_COUNTER +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) +#else +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#endif + +#include <iosfwd> +#include <string> +#include <cstdint> + +// We need a dummy global operator<< so we can bring it into Catch namespace later +struct Catch_global_namespace_dummy {}; +std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy); + +namespace Catch { + + struct CaseSensitive { enum Choice { + Yes, + No + }; }; + + class NonCopyable { + NonCopyable( NonCopyable const& ) = delete; + NonCopyable( NonCopyable && ) = delete; + NonCopyable& operator = ( NonCopyable const& ) = delete; + NonCopyable& operator = ( NonCopyable && ) = delete; + + protected: + NonCopyable(); + virtual ~NonCopyable(); + }; + + struct SourceLineInfo { + + SourceLineInfo() = delete; + SourceLineInfo( char const* _file, std::size_t _line ) noexcept + : file( _file ), + line( _line ) + {} + + SourceLineInfo( SourceLineInfo const& other ) = default; + SourceLineInfo& operator = ( SourceLineInfo const& ) = default; + SourceLineInfo( SourceLineInfo&& ) noexcept = default; + SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default; + + bool empty() const noexcept { return file[0] == '\0'; } + bool operator == ( SourceLineInfo const& other ) const noexcept; + bool operator < ( SourceLineInfo const& other ) const noexcept; + + char const* file; + std::size_t line; + }; + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); + + // Bring in operator<< from global namespace into Catch namespace + // This is necessary because the overload of operator<< above makes + // lookup stop at namespace Catch + using ::operator<<; + + // Use this in variadic streaming macros to allow + // >> +StreamEndStop + // as well as + // >> stuff +StreamEndStop + struct StreamEndStop { + std::string operator+() const; + }; + template<typename T> + T const& operator + ( T const& value, StreamEndStop ) { + return value; + } +} + +#define CATCH_INTERNAL_LINEINFO \ + ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) ) + +// end catch_common.h +namespace Catch { + + struct RegistrarForTagAliases { + RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); + }; + +} // end namespace Catch + +#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + +// end catch_tag_alias_autoregistrar.h +// start catch_test_registry.h + +// start catch_interfaces_testcase.h + +#include <vector> + +namespace Catch { + + class TestSpec; + + struct ITestInvoker { + virtual void invoke () const = 0; + virtual ~ITestInvoker(); + }; + + class TestCase; + struct IConfig; + + struct ITestCaseRegistry { + virtual ~ITestCaseRegistry(); + virtual std::vector<TestCase> const& getAllTests() const = 0; + virtual std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const = 0; + }; + + bool isThrowSafe( TestCase const& testCase, IConfig const& config ); + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); + std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ); + std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ); + +} + +// end catch_interfaces_testcase.h +// start catch_stringref.h + +#include <cstddef> +#include <string> +#include <iosfwd> +#include <cassert> + +namespace Catch { + + /// A non-owning string class (similar to the forthcoming std::string_view) + /// Note that, because a StringRef may be a substring of another string, + /// it may not be null terminated. + class StringRef { + public: + using size_type = std::size_t; + using const_iterator = const char*; + + private: + static constexpr char const* const s_empty = ""; + + char const* m_start = s_empty; + size_type m_size = 0; + + public: // construction + constexpr StringRef() noexcept = default; + + StringRef( char const* rawChars ) noexcept; + + constexpr StringRef( char const* rawChars, size_type size ) noexcept + : m_start( rawChars ), + m_size( size ) + {} + + StringRef( std::string const& stdString ) noexcept + : m_start( stdString.c_str() ), + m_size( stdString.size() ) + {} + + explicit operator std::string() const { + return std::string(m_start, m_size); + } + + public: // operators + auto operator == ( StringRef const& other ) const noexcept -> bool; + auto operator != (StringRef const& other) const noexcept -> bool { + return !(*this == other); + } + + auto operator[] ( size_type index ) const noexcept -> char { + assert(index < m_size); + return m_start[index]; + } + + public: // named queries + constexpr auto empty() const noexcept -> bool { + return m_size == 0; + } + constexpr auto size() const noexcept -> size_type { + return m_size; + } + + // Returns the current start pointer. If the StringRef is not + // null-terminated, throws std::domain_exception + auto c_str() const -> char const*; + + public: // substrings and searches + // Returns a substring of [start, start + length). + // If start + length > size(), then the substring is [start, size()). + // If start > size(), then the substring is empty. + auto substr( size_type start, size_type length ) const noexcept -> StringRef; + + // Returns the current start pointer. May not be null-terminated. + auto data() const noexcept -> char const*; + + constexpr auto isNullTerminated() const noexcept -> bool { + return m_start[m_size] == '\0'; + } + + public: // iterators + constexpr const_iterator begin() const { return m_start; } + constexpr const_iterator end() const { return m_start + m_size; } + }; + + auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&; + auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&; + + constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { + return StringRef( rawChars, size ); + } +} // namespace Catch + +constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { + return Catch::StringRef( rawChars, size ); +} + +// end catch_stringref.h +// start catch_preprocessor.hpp + + +#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__ +#define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__))) + +#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__ +// MSVC needs more evaluations +#define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__))) +#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__)) +#else +#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__) +#endif + +#define CATCH_REC_END(...) +#define CATCH_REC_OUT + +#define CATCH_EMPTY() +#define CATCH_DEFER(id) id CATCH_EMPTY() + +#define CATCH_REC_GET_END2() 0, CATCH_REC_END +#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2 +#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1 +#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT +#define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0) +#define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next) + +#define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST2(f, x, peek, ...) f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) + +#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD) ) ( f, userdata, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...) f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) + +// Applies the function macro `f` to each of the remaining parameters, inserts commas between the results, +// and passes userdata as the first parameter to each invocation, +// e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a), f(x, b), f(x, c) +#define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) + +#define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) + +#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param) +#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__ +#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__ +#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF +#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__) +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__ +#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) +#else +// MSVC is adding extra space and needs another indirection to expand INTERNAL_CATCH_NOINTERNAL_CATCH_DEF +#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__) +#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__ +#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1) +#endif + +#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__ +#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name) + +#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>()) +#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) +#else +#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>())) +#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) +#endif + +#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\ + CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__) + +#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0) +#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1) +#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2) +#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) +#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) +#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) +#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6) +#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) +#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) +#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) +#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) + +#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N + +#define INTERNAL_CATCH_TYPE_GEN\ + template<typename...> struct TypeList {};\ + template<typename...Ts>\ + constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\ + template<template<typename...> class...> struct TemplateTypeList{};\ + template<template<typename...> class...Cs>\ + constexpr auto get_wrapper() noexcept -> TemplateTypeList<Cs...> { return {}; }\ + template<typename...>\ + struct append;\ + template<typename...>\ + struct rewrap;\ + template<template<typename...> class, typename...>\ + struct create;\ + template<template<typename...> class, typename>\ + struct convert;\ + \ + template<typename T> \ + struct append<T> { using type = T; };\ + template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\ + struct append<L1<E1...>, L2<E2...>, Rest...> { using type = typename append<L1<E1...,E2...>, Rest...>::type; };\ + template< template<typename...> class L1, typename...E1, typename...Rest>\ + struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> { using type = L1<E1...>; };\ + \ + template< template<typename...> class Container, template<typename...> class List, typename...elems>\ + struct rewrap<TemplateTypeList<Container>, List<elems...>> { using type = TypeList<Container<elems...>>; };\ + template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\ + struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> { using type = typename append<TypeList<Container<Elems...>>, typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type; };\ + \ + template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\ + struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type; };\ + template<template <typename...> class Final, template <typename...> class List, typename...Ts>\ + struct convert<Final, List<Ts...>> { using type = typename append<Final<>,TypeList<Ts>...>::type; }; + +#define INTERNAL_CATCH_NTTP_1(signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \ + template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...> struct NttpTemplateTypeList{};\ + template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Cs>\ + constexpr auto get_wrapper() noexcept -> NttpTemplateTypeList<Cs...> { return {}; } \ + \ + template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> { using type = TypeList<Container<__VA_ARGS__>>; };\ + template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\ + struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> { using type = typename append<TypeList<Container<__VA_ARGS__>>, typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type; };\ + template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\ + struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type; }; + +#define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName) +#define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + static void TestName() +#define INTERNAL_CATCH_DECLARE_SIG_TEST_X(TestName, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + static void TestName() + +#define INTERNAL_CATCH_DEFINE_SIG_TEST0(TestName) +#define INTERNAL_CATCH_DEFINE_SIG_TEST1(TestName, signature)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + static void TestName() +#define INTERNAL_CATCH_DEFINE_SIG_TEST_X(TestName, signature,...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + static void TestName() + +#define INTERNAL_CATCH_NTTP_REGISTER0(TestFunc, signature)\ + template<typename Type>\ + void reg_test(TypeList<Type>, Catch::NameAndTags nameAndTags)\ + {\ + Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<Type>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\ + } + +#define INTERNAL_CATCH_NTTP_REGISTER(TestFunc, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + void reg_test(Nttp<__VA_ARGS__>, Catch::NameAndTags nameAndTags)\ + {\ + Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<__VA_ARGS__>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\ + } + +#define INTERNAL_CATCH_NTTP_REGISTER_METHOD0(TestName, signature, ...)\ + template<typename Type>\ + void reg_test(TypeList<Type>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\ + {\ + Catch::AutoReg( Catch::makeTestInvoker(&TestName<Type>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\ + } + +#define INTERNAL_CATCH_NTTP_REGISTER_METHOD(TestName, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ + void reg_test(Nttp<__VA_ARGS__>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\ + {\ + Catch::AutoReg( Catch::makeTestInvoker(&TestName<__VA_ARGS__>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\ + } + +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0(TestName, ClassName) +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1(TestName, ClassName, signature)\ + template<typename TestType> \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<TestType> { \ + void test();\ + } + +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X(TestName, ClassName, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<__VA_ARGS__> { \ + void test();\ + } + +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0(TestName) +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1(TestName, signature)\ + template<typename TestType> \ + void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<TestType>::test() +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X(TestName, signature, ...)\ + template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \ + void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<__VA_ARGS__>::test() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_NTTP_0 +#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__),INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_0) +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__) +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__) +#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__) +#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__) +#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__) +#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__) +#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__) +#else +#define INTERNAL_CATCH_NTTP_0(signature) +#define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1,INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_0)( __VA_ARGS__)) +#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__)) +#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__)) +#define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__)) +#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__)) +#define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__)) +#define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__)) +#define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__)) +#endif + +// end catch_preprocessor.hpp +// start catch_meta.hpp + + +#include <type_traits> + +namespace Catch { + template<typename T> + struct always_false : std::false_type {}; + + template <typename> struct true_given : std::true_type {}; + struct is_callable_tester { + template <typename Fun, typename... Args> + true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int); + template <typename...> + std::false_type static test(...); + }; + + template <typename T> + struct is_callable; + + template <typename Fun, typename... Args> + struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {}; + +#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703 + // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is + // replaced with std::invoke_result here. + template <typename Func, typename... U> + using FunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U...>>>; +#else + // Keep ::type here because we still support C++11 + template <typename Func, typename... U> + using FunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U...)>::type>::type>::type; +#endif + +} // namespace Catch + +namespace mpl_{ + struct na; +} + +// end catch_meta.hpp +namespace Catch { + +template<typename C> +class TestInvokerAsMethod : public ITestInvoker { + void (C::*m_testAsMethod)(); +public: + TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {} + + void invoke() const override { + C obj; + (obj.*m_testAsMethod)(); + } +}; + +auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker*; + +template<typename C> +auto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInvoker* { + return new(std::nothrow) TestInvokerAsMethod<C>( testAsMethod ); +} + +struct NameAndTags { + NameAndTags( StringRef const& name_ = StringRef(), StringRef const& tags_ = StringRef() ) noexcept; + StringRef name; + StringRef tags; +}; + +struct AutoReg : NonCopyable { + AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept; + ~AutoReg(); +}; + +} // end namespace Catch + +#if defined(CATCH_CONFIG_DISABLE) + #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \ + static void TestName() + #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \ + namespace{ \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ + void test(); \ + }; \ + } \ + void TestName::test() + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( TestName, TestFunc, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature)) + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ + namespace{ \ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \ + INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ + } \ + } \ + INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature)) + + #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) + #else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) + #endif + + #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) + #else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) + #endif + + #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) + #else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) + #endif + + #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) + #else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) + #endif +#endif + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ + static void TestName(); \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + static void TestName() + #define INTERNAL_CATCH_TESTCASE( ... ) \ + INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, "&" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ + void test(); \ + }; \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ + } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + void TestName::test() + #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ + INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + + /////////////////////////////////////////////////////////////////////////////// + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\ + INTERNAL_CATCH_TYPE_GEN\ + INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + INTERNAL_CATCH_NTTP_REG_GEN(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + template<typename...Types> \ + struct TestName{\ + TestName(){\ + int index = 0; \ + constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ + using expander = int[];\ + (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \ + }\ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ + TestName<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\ + return 0;\ + }();\ + }\ + }\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature)) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) +#endif + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) +#endif + + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> static void TestFuncName(); \ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \ + INTERNAL_CATCH_TYPE_GEN \ + INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature)) \ + template<typename... Types> \ + struct TestName { \ + void reg_tests() { \ + int index = 0; \ + using expander = int[]; \ + constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ + constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ + constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */\ + } \ + }; \ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ + using TestInit = typename create<TestName, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type; \ + TestInit t; \ + t.reg_tests(); \ + return 0; \ + }(); \ + } \ + } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + static void TestFuncName() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T,__VA_ARGS__) +#else + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T, __VA_ARGS__ ) ) +#endif + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__) +#else + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) +#endif + + #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> static void TestFunc(); \ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\ + INTERNAL_CATCH_TYPE_GEN\ + template<typename... Types> \ + struct TestName { \ + void reg_tests() { \ + int index = 0; \ + using expander = int[]; \ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */\ + } \ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ + using TestInit = typename convert<TestName, TmplList>::type; \ + TestInit t; \ + t.reg_tests(); \ + return 0; \ + }(); \ + }}\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + static void TestFunc() + + #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \ + INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, TmplList ) + + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \ + INTERNAL_CATCH_TYPE_GEN\ + INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ + INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + template<typename...Types> \ + struct TestNameClass{\ + TestNameClass(){\ + int index = 0; \ + constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ + using expander = int[];\ + (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \ + }\ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ + TestNameClass<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\ + return 0;\ + }();\ + }\ + }\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature)) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) +#endif + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) +#endif + + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ + void test();\ + };\ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestNameClass) {\ + INTERNAL_CATCH_TYPE_GEN \ + INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\ + template<typename...Types>\ + struct TestNameClass{\ + void reg_tests(){\ + int index = 0;\ + using expander = int[];\ + constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ + constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ + constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */ \ + }\ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ + using TestInit = typename create<TestNameClass, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;\ + TestInit t;\ + t.reg_tests();\ + return 0;\ + }(); \ + }\ + }\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + void TestName<TestType>::test() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T,__VA_ARGS__ ) ) +#endif + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ + INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature, __VA_ARGS__ ) +#else + #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ + INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) ) +#endif + + #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + template<typename TestType> \ + struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ + void test();\ + };\ + namespace {\ + namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \ + INTERNAL_CATCH_TYPE_GEN\ + template<typename...Types>\ + struct TestNameClass{\ + void reg_tests(){\ + int index = 0;\ + using expander = int[];\ + (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */ \ + }\ + };\ + static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ + using TestInit = typename convert<TestNameClass, TmplList>::type;\ + TestInit t;\ + t.reg_tests();\ + return 0;\ + }(); \ + }}\ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + template<typename TestType> \ + void TestName<TestType>::test() + +#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \ + INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, TmplList ) + +// end catch_test_registry.h +// start catch_capture.hpp + +// start catch_assertionhandler.h + +// start catch_assertioninfo.h + +// start catch_result_type.h + +namespace Catch { + + // ResultWas::OfType enum + struct ResultWas { enum OfType { + Unknown = -1, + Ok = 0, + Info = 1, + Warning = 2, + + FailureBit = 0x10, + + ExpressionFailed = FailureBit | 1, + ExplicitFailure = FailureBit | 2, + + Exception = 0x100 | FailureBit, + + ThrewException = Exception | 1, + DidntThrowException = Exception | 2, + + FatalErrorCondition = 0x200 | FailureBit + + }; }; + + bool isOk( ResultWas::OfType resultType ); + bool isJustInfo( int flags ); + + // ResultDisposition::Flags enum + struct ResultDisposition { enum Flags { + Normal = 0x01, + + ContinueOnFailure = 0x02, // Failures fail test, but execution continues + FalseTest = 0x04, // Prefix expression with ! + SuppressFail = 0x08 // Failures are reported but do not fail the test + }; }; + + ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ); + + bool shouldContinueOnFailure( int flags ); + inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } + bool shouldSuppressFailure( int flags ); + +} // end namespace Catch + +// end catch_result_type.h +namespace Catch { + + struct AssertionInfo + { + StringRef macroName; + SourceLineInfo lineInfo; + StringRef capturedExpression; + ResultDisposition::Flags resultDisposition; + + // We want to delete this constructor but a compiler bug in 4.8 means + // the struct is then treated as non-aggregate + //AssertionInfo() = delete; + }; + +} // end namespace Catch + +// end catch_assertioninfo.h +// start catch_decomposer.h + +// start catch_tostring.h + +#include <vector> +#include <cstddef> +#include <type_traits> +#include <string> +// start catch_stream.h + +#include <iosfwd> +#include <cstddef> +#include <ostream> + +namespace Catch { + + std::ostream& cout(); + std::ostream& cerr(); + std::ostream& clog(); + + class StringRef; + + struct IStream { + virtual ~IStream(); + virtual std::ostream& stream() const = 0; + }; + + auto makeStream( StringRef const &filename ) -> IStream const*; + + class ReusableStringStream : NonCopyable { + std::size_t m_index; + std::ostream* m_oss; + public: + ReusableStringStream(); + ~ReusableStringStream(); + + auto str() const -> std::string; + + template<typename T> + auto operator << ( T const& value ) -> ReusableStringStream& { + *m_oss << value; + return *this; + } + auto get() -> std::ostream& { return *m_oss; } + }; +} + +// end catch_stream.h +// start catch_interfaces_enum_values_registry.h + +#include <vector> + +namespace Catch { + + namespace Detail { + struct EnumInfo { + StringRef m_name; + std::vector<std::pair<int, StringRef>> m_values; + + ~EnumInfo(); + + StringRef lookup( int value ) const; + }; + } // namespace Detail + + struct IMutableEnumValuesRegistry { + virtual ~IMutableEnumValuesRegistry(); + + virtual Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values ) = 0; + + template<typename E> + Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::initializer_list<E> values ) { + static_assert(sizeof(int) >= sizeof(E), "Cannot serialize enum to int"); + std::vector<int> intValues; + intValues.reserve( values.size() ); + for( auto enumValue : values ) + intValues.push_back( static_cast<int>( enumValue ) ); + return registerEnum( enumName, allEnums, intValues ); + } + }; + +} // Catch + +// end catch_interfaces_enum_values_registry.h + +#ifdef CATCH_CONFIG_CPP17_STRING_VIEW +#include <string_view> +#endif + +#ifdef __OBJC__ +// start catch_objc_arc.hpp + +#import <Foundation/Foundation.h> + +#ifdef __has_feature +#define CATCH_ARC_ENABLED __has_feature(objc_arc) +#else +#define CATCH_ARC_ENABLED 0 +#endif + +void arcSafeRelease( NSObject* obj ); +id performOptionalSelector( id obj, SEL sel ); + +#if !CATCH_ARC_ENABLED +inline void arcSafeRelease( NSObject* obj ) { + [obj release]; +} +inline id performOptionalSelector( id obj, SEL sel ) { + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; + return nil; +} +#define CATCH_UNSAFE_UNRETAINED +#define CATCH_ARC_STRONG +#else +inline void arcSafeRelease( NSObject* ){} +inline id performOptionalSelector( id obj, SEL sel ) { +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" +#endif + if( [obj respondsToSelector: sel] ) + return [obj performSelector: sel]; +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + return nil; +} +#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained +#define CATCH_ARC_STRONG __strong +#endif + +// end catch_objc_arc.hpp +#endif + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4180) // We attempt to stream a function (address) by const&, which MSVC complains about but is harmless +#endif + +namespace Catch { + namespace Detail { + + extern const std::string unprintableString; + + std::string rawMemoryToString( const void *object, std::size_t size ); + + template<typename T> + std::string rawMemoryToString( const T& object ) { + return rawMemoryToString( &object, sizeof(object) ); + } + + template<typename T> + class IsStreamInsertable { + template<typename Stream, typename U> + static auto test(int) + -> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type()); + + template<typename, typename> + static auto test(...)->std::false_type; + + public: + static const bool value = decltype(test<std::ostream, const T&>(0))::value; + }; + + template<typename E> + std::string convertUnknownEnumToString( E e ); + + template<typename T> + typename std::enable_if< + !std::is_enum<T>::value && !std::is_base_of<std::exception, T>::value, + std::string>::type convertUnstreamable( T const& ) { + return Detail::unprintableString; + } + template<typename T> + typename std::enable_if< + !std::is_enum<T>::value && std::is_base_of<std::exception, T>::value, + std::string>::type convertUnstreamable(T const& ex) { + return ex.what(); + } + + template<typename T> + typename std::enable_if< + std::is_enum<T>::value + , std::string>::type convertUnstreamable( T const& value ) { + return convertUnknownEnumToString( value ); + } + +#if defined(_MANAGED) + //! Convert a CLR string to a utf8 std::string + template<typename T> + std::string clrReferenceToString( T^ ref ) { + if (ref == nullptr) + return std::string("null"); + auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString()); + cli::pin_ptr<System::Byte> p = &bytes[0]; + return std::string(reinterpret_cast<char const *>(p), bytes->Length); + } +#endif + + } // namespace Detail + + // If we decide for C++14, change these to enable_if_ts + template <typename T, typename = void> + struct StringMaker { + template <typename Fake = T> + static + typename std::enable_if<::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type + convert(const Fake& value) { + ReusableStringStream rss; + // NB: call using the function-like syntax to avoid ambiguity with + // user-defined templated operator<< under clang. + rss.operator<<(value); + return rss.str(); + } + + template <typename Fake = T> + static + typename std::enable_if<!::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type + convert( const Fake& value ) { +#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER) + return Detail::convertUnstreamable(value); +#else + return CATCH_CONFIG_FALLBACK_STRINGIFIER(value); +#endif + } + }; + + namespace Detail { + + // This function dispatches all stringification requests inside of Catch. + // Should be preferably called fully qualified, like ::Catch::Detail::stringify + template <typename T> + std::string stringify(const T& e) { + return ::Catch::StringMaker<typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(e); + } + + template<typename E> + std::string convertUnknownEnumToString( E e ) { + return ::Catch::Detail::stringify(static_cast<typename std::underlying_type<E>::type>(e)); + } + +#if defined(_MANAGED) + template <typename T> + std::string stringify( T^ e ) { + return ::Catch::StringMaker<T^>::convert(e); + } +#endif + + } // namespace Detail + + // Some predefined specializations + + template<> + struct StringMaker<std::string> { + static std::string convert(const std::string& str); + }; + +#ifdef CATCH_CONFIG_CPP17_STRING_VIEW + template<> + struct StringMaker<std::string_view> { + static std::string convert(std::string_view str); + }; +#endif + + template<> + struct StringMaker<char const *> { + static std::string convert(char const * str); + }; + template<> + struct StringMaker<char *> { + static std::string convert(char * str); + }; + +#ifdef CATCH_CONFIG_WCHAR + template<> + struct StringMaker<std::wstring> { + static std::string convert(const std::wstring& wstr); + }; + +# ifdef CATCH_CONFIG_CPP17_STRING_VIEW + template<> + struct StringMaker<std::wstring_view> { + static std::string convert(std::wstring_view str); + }; +# endif + + template<> + struct StringMaker<wchar_t const *> { + static std::string convert(wchar_t const * str); + }; + template<> + struct StringMaker<wchar_t *> { + static std::string convert(wchar_t * str); + }; +#endif + + // TBD: Should we use `strnlen` to ensure that we don't go out of the buffer, + // while keeping string semantics? + template<int SZ> + struct StringMaker<char[SZ]> { + static std::string convert(char const* str) { + return ::Catch::Detail::stringify(std::string{ str }); + } + }; + template<int SZ> + struct StringMaker<signed char[SZ]> { + static std::string convert(signed char const* str) { + return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) }); + } + }; + template<int SZ> + struct StringMaker<unsigned char[SZ]> { + static std::string convert(unsigned char const* str) { + return ::Catch::Detail::stringify(std::string{ reinterpret_cast<char const *>(str) }); + } + }; + +#if defined(CATCH_CONFIG_CPP17_BYTE) + template<> + struct StringMaker<std::byte> { + static std::string convert(std::byte value); + }; +#endif // defined(CATCH_CONFIG_CPP17_BYTE) + template<> + struct StringMaker<int> { + static std::string convert(int value); + }; + template<> + struct StringMaker<long> { + static std::string convert(long value); + }; + template<> + struct StringMaker<long long> { + static std::string convert(long long value); + }; + template<> + struct StringMaker<unsigned int> { + static std::string convert(unsigned int value); + }; + template<> + struct StringMaker<unsigned long> { + static std::string convert(unsigned long value); + }; + template<> + struct StringMaker<unsigned long long> { + static std::string convert(unsigned long long value); + }; + + template<> + struct StringMaker<bool> { + static std::string convert(bool b); + }; + + template<> + struct StringMaker<char> { + static std::string convert(char c); + }; + template<> + struct StringMaker<signed char> { + static std::string convert(signed char c); + }; + template<> + struct StringMaker<unsigned char> { + static std::string convert(unsigned char c); + }; + + template<> + struct StringMaker<std::nullptr_t> { + static std::string convert(std::nullptr_t); + }; + + template<> + struct StringMaker<float> { + static std::string convert(float value); + static int precision; + }; + + template<> + struct StringMaker<double> { + static std::string convert(double value); + static int precision; + }; + + template <typename T> + struct StringMaker<T*> { + template <typename U> + static std::string convert(U* p) { + if (p) { + return ::Catch::Detail::rawMemoryToString(p); + } else { + return "nullptr"; + } + } + }; + + template <typename R, typename C> + struct StringMaker<R C::*> { + static std::string convert(R C::* p) { + if (p) { + return ::Catch::Detail::rawMemoryToString(p); + } else { + return "nullptr"; + } + } + }; + +#if defined(_MANAGED) + template <typename T> + struct StringMaker<T^> { + static std::string convert( T^ ref ) { + return ::Catch::Detail::clrReferenceToString(ref); + } + }; +#endif + + namespace Detail { + template<typename InputIterator, typename Sentinel = InputIterator> + std::string rangeToString(InputIterator first, Sentinel last) { + ReusableStringStream rss; + rss << "{ "; + if (first != last) { + rss << ::Catch::Detail::stringify(*first); + for (++first; first != last; ++first) + rss << ", " << ::Catch::Detail::stringify(*first); + } + rss << " }"; + return rss.str(); + } + } + +#ifdef __OBJC__ + template<> + struct StringMaker<NSString*> { + static std::string convert(NSString * nsstring) { + if (!nsstring) + return "nil"; + return std::string("@") + [nsstring UTF8String]; + } + }; + template<> + struct StringMaker<NSObject*> { + static std::string convert(NSObject* nsObject) { + return ::Catch::Detail::stringify([nsObject description]); + } + + }; + namespace Detail { + inline std::string stringify( NSString* nsstring ) { + return StringMaker<NSString*>::convert( nsstring ); + } + + } // namespace Detail +#endif // __OBJC__ + +} // namespace Catch + +////////////////////////////////////////////////////// +// Separate std-lib types stringification, so it can be selectively enabled +// This means that we do not bring in + +#if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS) +# define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER +# define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER +# define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER +# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER +# define CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER +#endif + +// Separate std::pair specialization +#if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER) +#include <utility> +namespace Catch { + template<typename T1, typename T2> + struct StringMaker<std::pair<T1, T2> > { + static std::string convert(const std::pair<T1, T2>& pair) { + ReusableStringStream rss; + rss << "{ " + << ::Catch::Detail::stringify(pair.first) + << ", " + << ::Catch::Detail::stringify(pair.second) + << " }"; + return rss.str(); + } + }; +} +#endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER + +#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL) +#include <optional> +namespace Catch { + template<typename T> + struct StringMaker<std::optional<T> > { + static std::string convert(const std::optional<T>& optional) { + ReusableStringStream rss; + if (optional.has_value()) { + rss << ::Catch::Detail::stringify(*optional); + } else { + rss << "{ }"; + } + return rss.str(); + } + }; +} +#endif // CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER + +// Separate std::tuple specialization +#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER) +#include <tuple> +namespace Catch { + namespace Detail { + template< + typename Tuple, + std::size_t N = 0, + bool = (N < std::tuple_size<Tuple>::value) + > + struct TupleElementPrinter { + static void print(const Tuple& tuple, std::ostream& os) { + os << (N ? ", " : " ") + << ::Catch::Detail::stringify(std::get<N>(tuple)); + TupleElementPrinter<Tuple, N + 1>::print(tuple, os); + } + }; + + template< + typename Tuple, + std::size_t N + > + struct TupleElementPrinter<Tuple, N, false> { + static void print(const Tuple&, std::ostream&) {} + }; + + } + + template<typename ...Types> + struct StringMaker<std::tuple<Types...>> { + static std::string convert(const std::tuple<Types...>& tuple) { + ReusableStringStream rss; + rss << '{'; + Detail::TupleElementPrinter<std::tuple<Types...>>::print(tuple, rss.get()); + rss << " }"; + return rss.str(); + } + }; +} +#endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER + +#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT) +#include <variant> +namespace Catch { + template<> + struct StringMaker<std::monostate> { + static std::string convert(const std::monostate&) { + return "{ }"; + } + }; + + template<typename... Elements> + struct StringMaker<std::variant<Elements...>> { + static std::string convert(const std::variant<Elements...>& variant) { + if (variant.valueless_by_exception()) { + return "{valueless variant}"; + } else { + return std::visit( + [](const auto& value) { + return ::Catch::Detail::stringify(value); + }, + variant + ); + } + } + }; +} +#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER + +namespace Catch { + // Import begin/ end from std here + using std::begin; + using std::end; + + namespace detail { + template <typename...> + struct void_type { + using type = void; + }; + + template <typename T, typename = void> + struct is_range_impl : std::false_type { + }; + + template <typename T> + struct is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type> : std::true_type { + }; + } // namespace detail + + template <typename T> + struct is_range : detail::is_range_impl<T> { + }; + +#if defined(_MANAGED) // Managed types are never ranges + template <typename T> + struct is_range<T^> { + static const bool value = false; + }; +#endif + + template<typename Range> + std::string rangeToString( Range const& range ) { + return ::Catch::Detail::rangeToString( begin( range ), end( range ) ); + } + + // Handle vector<bool> specially + template<typename Allocator> + std::string rangeToString( std::vector<bool, Allocator> const& v ) { + ReusableStringStream rss; + rss << "{ "; + bool first = true; + for( bool b : v ) { + if( first ) + first = false; + else + rss << ", "; + rss << ::Catch::Detail::stringify( b ); + } + rss << " }"; + return rss.str(); + } + + template<typename R> + struct StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> { + static std::string convert( R const& range ) { + return rangeToString( range ); + } + }; + + template <typename T, int SZ> + struct StringMaker<T[SZ]> { + static std::string convert(T const(&arr)[SZ]) { + return rangeToString(arr); + } + }; + +} // namespace Catch + +// Separate std::chrono::duration specialization +#if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) +#include <ctime> +#include <ratio> +#include <chrono> + +namespace Catch { + +template <class Ratio> +struct ratio_string { + static std::string symbol(); +}; + +template <class Ratio> +std::string ratio_string<Ratio>::symbol() { + Catch::ReusableStringStream rss; + rss << '[' << Ratio::num << '/' + << Ratio::den << ']'; + return rss.str(); +} +template <> +struct ratio_string<std::atto> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::femto> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::pico> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::nano> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::micro> { + static std::string symbol(); +}; +template <> +struct ratio_string<std::milli> { + static std::string symbol(); +}; + + //////////// + // std::chrono::duration specializations + template<typename Value, typename Ratio> + struct StringMaker<std::chrono::duration<Value, Ratio>> { + static std::string convert(std::chrono::duration<Value, Ratio> const& duration) { + ReusableStringStream rss; + rss << duration.count() << ' ' << ratio_string<Ratio>::symbol() << 's'; + return rss.str(); + } + }; + template<typename Value> + struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> { + static std::string convert(std::chrono::duration<Value, std::ratio<1>> const& duration) { + ReusableStringStream rss; + rss << duration.count() << " s"; + return rss.str(); + } + }; + template<typename Value> + struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> { + static std::string convert(std::chrono::duration<Value, std::ratio<60>> const& duration) { + ReusableStringStream rss; + rss << duration.count() << " m"; + return rss.str(); + } + }; + template<typename Value> + struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> { + static std::string convert(std::chrono::duration<Value, std::ratio<3600>> const& duration) { + ReusableStringStream rss; + rss << duration.count() << " h"; + return rss.str(); + } + }; + + //////////// + // std::chrono::time_point specialization + // Generic time_point cannot be specialized, only std::chrono::time_point<system_clock> + template<typename Clock, typename Duration> + struct StringMaker<std::chrono::time_point<Clock, Duration>> { + static std::string convert(std::chrono::time_point<Clock, Duration> const& time_point) { + return ::Catch::Detail::stringify(time_point.time_since_epoch()) + " since epoch"; + } + }; + // std::chrono::time_point<system_clock> specialization + template<typename Duration> + struct StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> { + static std::string convert(std::chrono::time_point<std::chrono::system_clock, Duration> const& time_point) { + auto converted = std::chrono::system_clock::to_time_t(time_point); + +#ifdef _MSC_VER + std::tm timeInfo = {}; + gmtime_s(&timeInfo, &converted); +#else + std::tm* timeInfo = std::gmtime(&converted); +#endif + + auto const timeStampSize = sizeof("2017-01-16T17:06:45Z"); + char timeStamp[timeStampSize]; + const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; + +#ifdef _MSC_VER + std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); +#else + std::strftime(timeStamp, timeStampSize, fmt, timeInfo); +#endif + return std::string(timeStamp); + } + }; +} +#endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER + +#define INTERNAL_CATCH_REGISTER_ENUM( enumName, ... ) \ +namespace Catch { \ + template<> struct StringMaker<enumName> { \ + static std::string convert( enumName value ) { \ + static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( #enumName, #__VA_ARGS__, { __VA_ARGS__ } ); \ + return static_cast<std::string>(enumInfo.lookup( static_cast<int>( value ) )); \ + } \ + }; \ +} + +#define CATCH_REGISTER_ENUM( enumName, ... ) INTERNAL_CATCH_REGISTER_ENUM( enumName, __VA_ARGS__ ) + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// end catch_tostring.h +#include <iosfwd> + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4389) // '==' : signed/unsigned mismatch +#pragma warning(disable:4018) // more "signed/unsigned mismatch" +#pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform) +#pragma warning(disable:4180) // qualifier applied to function type has no meaning +#pragma warning(disable:4800) // Forcing result to true or false +#endif + +namespace Catch { + + struct ITransientExpression { + auto isBinaryExpression() const -> bool { return m_isBinaryExpression; } + auto getResult() const -> bool { return m_result; } + virtual void streamReconstructedExpression( std::ostream &os ) const = 0; + + ITransientExpression( bool isBinaryExpression, bool result ) + : m_isBinaryExpression( isBinaryExpression ), + m_result( result ) + {} + + // We don't actually need a virtual destructor, but many static analysers + // complain if it's not here :-( + virtual ~ITransientExpression(); + + bool m_isBinaryExpression; + bool m_result; + + }; + + void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ); + + template<typename LhsT, typename RhsT> + class BinaryExpr : public ITransientExpression { + LhsT m_lhs; + StringRef m_op; + RhsT m_rhs; + + void streamReconstructedExpression( std::ostream &os ) const override { + formatReconstructedExpression + ( os, Catch::Detail::stringify( m_lhs ), m_op, Catch::Detail::stringify( m_rhs ) ); + } + + public: + BinaryExpr( bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs ) + : ITransientExpression{ true, comparisonResult }, + m_lhs( lhs ), + m_op( op ), + m_rhs( rhs ) + {} + + template<typename T> + auto operator && ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator || ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator == ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator != ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator > ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator < ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator >= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename T> + auto operator <= ( T ) const -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<T>::value, + "chained comparisons are not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + }; + + template<typename LhsT> + class UnaryExpr : public ITransientExpression { + LhsT m_lhs; + + void streamReconstructedExpression( std::ostream &os ) const override { + os << Catch::Detail::stringify( m_lhs ); + } + + public: + explicit UnaryExpr( LhsT lhs ) + : ITransientExpression{ false, static_cast<bool>(lhs) }, + m_lhs( lhs ) + {} + }; + + // Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int) + template<typename LhsT, typename RhsT> + auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast<bool>(lhs == rhs); } + template<typename T> + auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); } + template<typename T> + auto compareEqual( T* const& lhs, long rhs ) -> bool { return lhs == reinterpret_cast<void const*>( rhs ); } + template<typename T> + auto compareEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; } + template<typename T> + auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) == rhs; } + + template<typename LhsT, typename RhsT> + auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast<bool>(lhs != rhs); } + template<typename T> + auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); } + template<typename T> + auto compareNotEqual( T* const& lhs, long rhs ) -> bool { return lhs != reinterpret_cast<void const*>( rhs ); } + template<typename T> + auto compareNotEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; } + template<typename T> + auto compareNotEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast<void const*>( lhs ) != rhs; } + + template<typename LhsT> + class ExprLhs { + LhsT m_lhs; + public: + explicit ExprLhs( LhsT lhs ) : m_lhs( lhs ) {} + + template<typename RhsT> + auto operator == ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { compareEqual( m_lhs, rhs ), m_lhs, "==", rhs }; + } + auto operator == ( bool rhs ) -> BinaryExpr<LhsT, bool> const { + return { m_lhs == rhs, m_lhs, "==", rhs }; + } + + template<typename RhsT> + auto operator != ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { compareNotEqual( m_lhs, rhs ), m_lhs, "!=", rhs }; + } + auto operator != ( bool rhs ) -> BinaryExpr<LhsT, bool> const { + return { m_lhs != rhs, m_lhs, "!=", rhs }; + } + + template<typename RhsT> + auto operator > ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs > rhs), m_lhs, ">", rhs }; + } + template<typename RhsT> + auto operator < ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs < rhs), m_lhs, "<", rhs }; + } + template<typename RhsT> + auto operator >= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs >= rhs), m_lhs, ">=", rhs }; + } + template<typename RhsT> + auto operator <= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs <= rhs), m_lhs, "<=", rhs }; + } + template <typename RhsT> + auto operator | (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs | rhs), m_lhs, "|", rhs }; + } + template <typename RhsT> + auto operator & (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs & rhs), m_lhs, "&", rhs }; + } + template <typename RhsT> + auto operator ^ (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const { + return { static_cast<bool>(m_lhs ^ rhs), m_lhs, "^", rhs }; + } + + template<typename RhsT> + auto operator && ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<RhsT>::value, + "operator&& is not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + template<typename RhsT> + auto operator || ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const { + static_assert(always_false<RhsT>::value, + "operator|| is not supported inside assertions, " + "wrap the expression inside parentheses, or decompose it"); + } + + auto makeUnaryExpr() const -> UnaryExpr<LhsT> { + return UnaryExpr<LhsT>{ m_lhs }; + } + }; + + void handleExpression( ITransientExpression const& expr ); + + template<typename T> + void handleExpression( ExprLhs<T> const& expr ) { + handleExpression( expr.makeUnaryExpr() ); + } + + struct Decomposer { + template<typename T> + auto operator <= ( T const& lhs ) -> ExprLhs<T const&> { + return ExprLhs<T const&>{ lhs }; + } + + auto operator <=( bool value ) -> ExprLhs<bool> { + return ExprLhs<bool>{ value }; + } + }; + +} // end namespace Catch + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +// end catch_decomposer.h +// start catch_interfaces_capture.h + +#include <string> +#include <chrono> + +namespace Catch { + + class AssertionResult; + struct AssertionInfo; + struct SectionInfo; + struct SectionEndInfo; + struct MessageInfo; + struct MessageBuilder; + struct Counts; + struct AssertionReaction; + struct SourceLineInfo; + + struct ITransientExpression; + struct IGeneratorTracker; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + struct BenchmarkInfo; + template <typename Duration = std::chrono::duration<double, std::nano>> + struct BenchmarkStats; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + struct IResultCapture { + + virtual ~IResultCapture(); + + virtual bool sectionStarted( SectionInfo const& sectionInfo, + Counts& assertions ) = 0; + virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; + virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; + + virtual auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + virtual void benchmarkPreparing( std::string const& name ) = 0; + virtual void benchmarkStarting( BenchmarkInfo const& info ) = 0; + virtual void benchmarkEnded( BenchmarkStats<> const& stats ) = 0; + virtual void benchmarkFailed( std::string const& error ) = 0; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + virtual void pushScopedMessage( MessageInfo const& message ) = 0; + virtual void popScopedMessage( MessageInfo const& message ) = 0; + + virtual void emplaceUnscopedMessage( MessageBuilder const& builder ) = 0; + + virtual void handleFatalErrorCondition( StringRef message ) = 0; + + virtual void handleExpr + ( AssertionInfo const& info, + ITransientExpression const& expr, + AssertionReaction& reaction ) = 0; + virtual void handleMessage + ( AssertionInfo const& info, + ResultWas::OfType resultType, + StringRef const& message, + AssertionReaction& reaction ) = 0; + virtual void handleUnexpectedExceptionNotThrown + ( AssertionInfo const& info, + AssertionReaction& reaction ) = 0; + virtual void handleUnexpectedInflightException + ( AssertionInfo const& info, + std::string const& message, + AssertionReaction& reaction ) = 0; + virtual void handleIncomplete + ( AssertionInfo const& info ) = 0; + virtual void handleNonExpr + ( AssertionInfo const &info, + ResultWas::OfType resultType, + AssertionReaction &reaction ) = 0; + + virtual bool lastAssertionPassed() = 0; + virtual void assertionPassed() = 0; + + // Deprecated, do not use: + virtual std::string getCurrentTestName() const = 0; + virtual const AssertionResult* getLastResult() const = 0; + virtual void exceptionEarlyReported() = 0; + }; + + IResultCapture& getResultCapture(); +} + +// end catch_interfaces_capture.h +namespace Catch { + + struct TestFailureException{}; + struct AssertionResultData; + struct IResultCapture; + class RunContext; + + class LazyExpression { + friend class AssertionHandler; + friend struct AssertionStats; + friend class RunContext; + + ITransientExpression const* m_transientExpression = nullptr; + bool m_isNegated; + public: + LazyExpression( bool isNegated ); + LazyExpression( LazyExpression const& other ); + LazyExpression& operator = ( LazyExpression const& ) = delete; + + explicit operator bool() const; + + friend auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream&; + }; + + struct AssertionReaction { + bool shouldDebugBreak = false; + bool shouldThrow = false; + }; + + class AssertionHandler { + AssertionInfo m_assertionInfo; + AssertionReaction m_reaction; + bool m_completed = false; + IResultCapture& m_resultCapture; + + public: + AssertionHandler + ( StringRef const& macroName, + SourceLineInfo const& lineInfo, + StringRef capturedExpression, + ResultDisposition::Flags resultDisposition ); + ~AssertionHandler() { + if ( !m_completed ) { + m_resultCapture.handleIncomplete( m_assertionInfo ); + } + } + + template<typename T> + void handleExpr( ExprLhs<T> const& expr ) { + handleExpr( expr.makeUnaryExpr() ); + } + void handleExpr( ITransientExpression const& expr ); + + void handleMessage(ResultWas::OfType resultType, StringRef const& message); + + void handleExceptionThrownAsExpected(); + void handleUnexpectedExceptionNotThrown(); + void handleExceptionNotThrownAsExpected(); + void handleThrowingCallSkipped(); + void handleUnexpectedInflightException(); + + void complete(); + void setCompleted(); + + // query + auto allowThrows() const -> bool; + }; + + void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString ); + +} // namespace Catch + +// end catch_assertionhandler.h +// start catch_message.h + +#include <string> +#include <vector> + +namespace Catch { + + struct MessageInfo { + MessageInfo( StringRef const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ); + + StringRef macroName; + std::string message; + SourceLineInfo lineInfo; + ResultWas::OfType type; + unsigned int sequence; + + bool operator == ( MessageInfo const& other ) const; + bool operator < ( MessageInfo const& other ) const; + private: + static unsigned int globalCount; + }; + + struct MessageStream { + + template<typename T> + MessageStream& operator << ( T const& value ) { + m_stream << value; + return *this; + } + + ReusableStringStream m_stream; + }; + + struct MessageBuilder : MessageStream { + MessageBuilder( StringRef const& macroName, + SourceLineInfo const& lineInfo, + ResultWas::OfType type ); + + template<typename T> + MessageBuilder& operator << ( T const& value ) { + m_stream << value; + return *this; + } + + MessageInfo m_info; + }; + + class ScopedMessage { + public: + explicit ScopedMessage( MessageBuilder const& builder ); + ScopedMessage( ScopedMessage& duplicate ) = delete; + ScopedMessage( ScopedMessage&& old ); + ~ScopedMessage(); + + MessageInfo m_info; + bool m_moved; + }; + + class Capturer { + std::vector<MessageInfo> m_messages; + IResultCapture& m_resultCapture = getResultCapture(); + size_t m_captured = 0; + public: + Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ); + ~Capturer(); + + void captureValue( size_t index, std::string const& value ); + + template<typename T> + void captureValues( size_t index, T const& value ) { + captureValue( index, Catch::Detail::stringify( value ) ); + } + + template<typename T, typename... Ts> + void captureValues( size_t index, T const& value, Ts const&... values ) { + captureValue( index, Catch::Detail::stringify(value) ); + captureValues( index+1, values... ); + } + }; + +} // end namespace Catch + +// end catch_message.h +#if !defined(CATCH_CONFIG_DISABLE) + +#if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION) + #define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__ +#else + #define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION" +#endif + +#if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + +/////////////////////////////////////////////////////////////////////////////// +// Another way to speed-up compilation is to omit local try-catch for REQUIRE* +// macros. +#define INTERNAL_CATCH_TRY +#define INTERNAL_CATCH_CATCH( capturer ) + +#else // CATCH_CONFIG_FAST_COMPILE + +#define INTERNAL_CATCH_TRY try +#define INTERNAL_CATCH_CATCH( handler ) catch(...) { handler.handleUnexpectedInflightException(); } + +#endif + +#define INTERNAL_CATCH_REACT( handler ) handler.complete(); + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \ + do { \ + CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__); \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ + INTERNAL_CATCH_TRY { \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ + if( Catch::getResultCapture().lastAssertionPassed() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, ... ) \ + INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ + if( !Catch::getResultCapture().lastAssertionPassed() ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ + try { \ + static_cast<void>(__VA_ARGS__); \ + catchAssertionHandler.handleExceptionNotThrownAsExpected(); \ + } \ + catch( ... ) { \ + catchAssertionHandler.handleUnexpectedInflightException(); \ + } \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition); \ + if( catchAssertionHandler.allowThrows() ) \ + try { \ + static_cast<void>(__VA_ARGS__); \ + catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ + } \ + catch( ... ) { \ + catchAssertionHandler.handleExceptionThrownAsExpected(); \ + } \ + else \ + catchAssertionHandler.handleThrowingCallSkipped(); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr) ", " CATCH_INTERNAL_STRINGIFY(exceptionType), resultDisposition ); \ + if( catchAssertionHandler.allowThrows() ) \ + try { \ + static_cast<void>(expr); \ + catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ + } \ + catch( exceptionType const& ) { \ + catchAssertionHandler.handleExceptionThrownAsExpected(); \ + } \ + catch( ... ) { \ + catchAssertionHandler.handleUnexpectedInflightException(); \ + } \ + else \ + catchAssertionHandler.handleThrowingCallSkipped(); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \ + catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \ + auto varName = Catch::Capturer( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__ ); \ + varName.captureValues( 0, __VA_ARGS__ ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_INFO( macroName, log ) \ + Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log ); + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_UNSCOPED_INFO( macroName, log ) \ + Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log ) + +/////////////////////////////////////////////////////////////////////////////// +// Although this is matcher-based, it can be used with just a string +#define INTERNAL_CATCH_THROWS_STR_MATCHES( macroName, resultDisposition, matcher, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ + if( catchAssertionHandler.allowThrows() ) \ + try { \ + static_cast<void>(__VA_ARGS__); \ + catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ + } \ + catch( ... ) { \ + Catch::handleExceptionMatchExpr( catchAssertionHandler, matcher, #matcher##_catch_sr ); \ + } \ + else \ + catchAssertionHandler.handleThrowingCallSkipped(); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +#endif // CATCH_CONFIG_DISABLE + +// end catch_capture.hpp +// start catch_section.h + +// start catch_section_info.h + +// start catch_totals.h + +#include <cstddef> + +namespace Catch { + + struct Counts { + Counts operator - ( Counts const& other ) const; + Counts& operator += ( Counts const& other ); + + std::size_t total() const; + bool allPassed() const; + bool allOk() const; + + std::size_t passed = 0; + std::size_t failed = 0; + std::size_t failedButOk = 0; + }; + + struct Totals { + + Totals operator - ( Totals const& other ) const; + Totals& operator += ( Totals const& other ); + + Totals delta( Totals const& prevTotals ) const; + + int error = 0; + Counts assertions; + Counts testCases; + }; +} + +// end catch_totals.h +#include <string> + +namespace Catch { + + struct SectionInfo { + SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name ); + + // Deprecated + SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name, + std::string const& ) : SectionInfo( _lineInfo, _name ) {} + + std::string name; + std::string description; // !Deprecated: this will always be empty + SourceLineInfo lineInfo; + }; + + struct SectionEndInfo { + SectionInfo sectionInfo; + Counts prevAssertions; + double durationInSeconds; + }; + +} // end namespace Catch + +// end catch_section_info.h +// start catch_timer.h + +#include <cstdint> + +namespace Catch { + + auto getCurrentNanosecondsSinceEpoch() -> uint64_t; + auto getEstimatedClockResolution() -> uint64_t; + + class Timer { + uint64_t m_nanoseconds = 0; + public: + void start(); + auto getElapsedNanoseconds() const -> uint64_t; + auto getElapsedMicroseconds() const -> uint64_t; + auto getElapsedMilliseconds() const -> unsigned int; + auto getElapsedSeconds() const -> double; + }; + +} // namespace Catch + +// end catch_timer.h +#include <string> + +namespace Catch { + + class Section : NonCopyable { + public: + Section( SectionInfo const& info ); + ~Section(); + + // This indicates whether the section should be executed or not + explicit operator bool() const; + + private: + SectionInfo m_info; + + std::string m_name; + Counts m_assertions; + bool m_sectionIncluded; + Timer m_timer; + }; + +} // end namespace Catch + +#define INTERNAL_CATCH_SECTION( ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + +#define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ + if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + +// end catch_section.h +// start catch_interfaces_exception.h + +// start catch_interfaces_registry_hub.h + +#include <string> +#include <memory> + +namespace Catch { + + class TestCase; + struct ITestCaseRegistry; + struct IExceptionTranslatorRegistry; + struct IExceptionTranslator; + struct IReporterRegistry; + struct IReporterFactory; + struct ITagAliasRegistry; + struct IMutableEnumValuesRegistry; + + class StartupExceptionRegistry; + + using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>; + + struct IRegistryHub { + virtual ~IRegistryHub(); + + virtual IReporterRegistry const& getReporterRegistry() const = 0; + virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; + virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0; + virtual IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const = 0; + + virtual StartupExceptionRegistry const& getStartupExceptionRegistry() const = 0; + }; + + struct IMutableRegistryHub { + virtual ~IMutableRegistryHub(); + virtual void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) = 0; + virtual void registerListener( IReporterFactoryPtr const& factory ) = 0; + virtual void registerTest( TestCase const& testInfo ) = 0; + virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; + virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0; + virtual void registerStartupException() noexcept = 0; + virtual IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() = 0; + }; + + IRegistryHub const& getRegistryHub(); + IMutableRegistryHub& getMutableRegistryHub(); + void cleanUp(); + std::string translateActiveException(); + +} + +// end catch_interfaces_registry_hub.h +#if defined(CATCH_CONFIG_DISABLE) + #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \ + static std::string translatorName( signature ) +#endif + +#include <exception> +#include <string> +#include <vector> + +namespace Catch { + using exceptionTranslateFunction = std::string(*)(); + + struct IExceptionTranslator; + using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>; + + struct IExceptionTranslator { + virtual ~IExceptionTranslator(); + virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; + }; + + struct IExceptionTranslatorRegistry { + virtual ~IExceptionTranslatorRegistry(); + + virtual std::string translateActiveException() const = 0; + }; + + class ExceptionTranslatorRegistrar { + template<typename T> + class ExceptionTranslator : public IExceptionTranslator { + public: + + ExceptionTranslator( std::string(*translateFunction)( T& ) ) + : m_translateFunction( translateFunction ) + {} + + std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override { +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + return ""; +#else + try { + if( it == itEnd ) + std::rethrow_exception(std::current_exception()); + else + return (*it)->translate( it+1, itEnd ); + } + catch( T& ex ) { + return m_translateFunction( ex ); + } +#endif + } + + protected: + std::string(*m_translateFunction)( T& ); + }; + + public: + template<typename T> + ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { + getMutableRegistryHub().registerTranslator + ( new ExceptionTranslator<T>( translateFunction ) ); + } + }; +} + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ + static std::string translatorName( signature ); \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \ + static std::string translatorName( signature ) + +#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) + +// end catch_interfaces_exception.h +// start catch_approx.h + +#include <type_traits> + +namespace Catch { +namespace Detail { + + class Approx { + private: + bool equalityComparisonImpl(double other) const; + // Validates the new margin (margin >= 0) + // out-of-line to avoid including stdexcept in the header + void setMargin(double margin); + // Validates the new epsilon (0 < epsilon < 1) + // out-of-line to avoid including stdexcept in the header + void setEpsilon(double epsilon); + + public: + explicit Approx ( double value ); + + static Approx custom(); + + Approx operator-() const; + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx operator()( T const& value ) { + Approx approx( static_cast<double>(value) ); + approx.m_epsilon = m_epsilon; + approx.m_margin = m_margin; + approx.m_scale = m_scale; + return approx; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + explicit Approx( T const& value ): Approx(static_cast<double>(value)) + {} + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator == ( const T& lhs, Approx const& rhs ) { + auto lhs_v = static_cast<double>(lhs); + return rhs.equalityComparisonImpl(lhs_v); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator == ( Approx const& lhs, const T& rhs ) { + return operator==( rhs, lhs ); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator != ( T const& lhs, Approx const& rhs ) { + return !operator==( lhs, rhs ); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator != ( Approx const& lhs, T const& rhs ) { + return !operator==( rhs, lhs ); + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator <= ( T const& lhs, Approx const& rhs ) { + return static_cast<double>(lhs) < rhs.m_value || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator <= ( Approx const& lhs, T const& rhs ) { + return lhs.m_value < static_cast<double>(rhs) || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator >= ( T const& lhs, Approx const& rhs ) { + return static_cast<double>(lhs) > rhs.m_value || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + friend bool operator >= ( Approx const& lhs, T const& rhs ) { + return lhs.m_value > static_cast<double>(rhs) || lhs == rhs; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx& epsilon( T const& newEpsilon ) { + double epsilonAsDouble = static_cast<double>(newEpsilon); + setEpsilon(epsilonAsDouble); + return *this; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx& margin( T const& newMargin ) { + double marginAsDouble = static_cast<double>(newMargin); + setMargin(marginAsDouble); + return *this; + } + + template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + Approx& scale( T const& newScale ) { + m_scale = static_cast<double>(newScale); + return *this; + } + + std::string toString() const; + + private: + double m_epsilon; + double m_margin; + double m_scale; + double m_value; + }; +} // end namespace Detail + +namespace literals { + Detail::Approx operator "" _a(long double val); + Detail::Approx operator "" _a(unsigned long long val); +} // end namespace literals + +template<> +struct StringMaker<Catch::Detail::Approx> { + static std::string convert(Catch::Detail::Approx const& value); +}; + +} // end namespace Catch + +// end catch_approx.h +// start catch_string_manip.h + +#include <string> +#include <iosfwd> +#include <vector> + +namespace Catch { + + bool startsWith( std::string const& s, std::string const& prefix ); + bool startsWith( std::string const& s, char prefix ); + bool endsWith( std::string const& s, std::string const& suffix ); + bool endsWith( std::string const& s, char suffix ); + bool contains( std::string const& s, std::string const& infix ); + void toLowerInPlace( std::string& s ); + std::string toLower( std::string const& s ); + //! Returns a new string without whitespace at the start/end + std::string trim( std::string const& str ); + //! Returns a substring of the original ref without whitespace. Beware lifetimes! + StringRef trim(StringRef ref); + + // !!! Be aware, returns refs into original string - make sure original string outlives them + std::vector<StringRef> splitStringRef( StringRef str, char delimiter ); + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); + + struct pluralise { + pluralise( std::size_t count, std::string const& label ); + + friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); + + std::size_t m_count; + std::string m_label; + }; +} + +// end catch_string_manip.h +#ifndef CATCH_CONFIG_DISABLE_MATCHERS +// start catch_capture_matchers.h + +// start catch_matchers.h + +#include <string> +#include <vector> + +namespace Catch { +namespace Matchers { + namespace Impl { + + template<typename ArgT> struct MatchAllOf; + template<typename ArgT> struct MatchAnyOf; + template<typename ArgT> struct MatchNotOf; + + class MatcherUntypedBase { + public: + MatcherUntypedBase() = default; + MatcherUntypedBase ( MatcherUntypedBase const& ) = default; + MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = delete; + std::string toString() const; + + protected: + virtual ~MatcherUntypedBase(); + virtual std::string describe() const = 0; + mutable std::string m_cachedToString; + }; + +#ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wnon-virtual-dtor" +#endif + + template<typename ObjectT> + struct MatcherMethod { + virtual bool match( ObjectT const& arg ) const = 0; + }; + +#if defined(__OBJC__) + // Hack to fix Catch GH issue #1661. Could use id for generic Object support. + // use of const for Object pointers is very uncommon and under ARC it causes some kind of signature mismatch that breaks compilation + template<> + struct MatcherMethod<NSString*> { + virtual bool match( NSString* arg ) const = 0; + }; +#endif + +#ifdef __clang__ +# pragma clang diagnostic pop +#endif + + template<typename T> + struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> { + + MatchAllOf<T> operator && ( MatcherBase const& other ) const; + MatchAnyOf<T> operator || ( MatcherBase const& other ) const; + MatchNotOf<T> operator ! () const; + }; + + template<typename ArgT> + struct MatchAllOf : MatcherBase<ArgT> { + bool match( ArgT const& arg ) const override { + for( auto matcher : m_matchers ) { + if (!matcher->match(arg)) + return false; + } + return true; + } + std::string describe() const override { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + bool first = true; + for( auto matcher : m_matchers ) { + if( first ) + first = false; + else + description += " and "; + description += matcher->toString(); + } + description += " )"; + return description; + } + + MatchAllOf<ArgT> operator && ( MatcherBase<ArgT> const& other ) { + auto copy(*this); + copy.m_matchers.push_back( &other ); + return copy; + } + + std::vector<MatcherBase<ArgT> const*> m_matchers; + }; + template<typename ArgT> + struct MatchAnyOf : MatcherBase<ArgT> { + + bool match( ArgT const& arg ) const override { + for( auto matcher : m_matchers ) { + if (matcher->match(arg)) + return true; + } + return false; + } + std::string describe() const override { + std::string description; + description.reserve( 4 + m_matchers.size()*32 ); + description += "( "; + bool first = true; + for( auto matcher : m_matchers ) { + if( first ) + first = false; + else + description += " or "; + description += matcher->toString(); + } + description += " )"; + return description; + } + + MatchAnyOf<ArgT> operator || ( MatcherBase<ArgT> const& other ) { + auto copy(*this); + copy.m_matchers.push_back( &other ); + return copy; + } + + std::vector<MatcherBase<ArgT> const*> m_matchers; + }; + + template<typename ArgT> + struct MatchNotOf : MatcherBase<ArgT> { + + MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} + + bool match( ArgT const& arg ) const override { + return !m_underlyingMatcher.match( arg ); + } + + std::string describe() const override { + return "not " + m_underlyingMatcher.toString(); + } + MatcherBase<ArgT> const& m_underlyingMatcher; + }; + + template<typename T> + MatchAllOf<T> MatcherBase<T>::operator && ( MatcherBase const& other ) const { + return MatchAllOf<T>() && *this && other; + } + template<typename T> + MatchAnyOf<T> MatcherBase<T>::operator || ( MatcherBase const& other ) const { + return MatchAnyOf<T>() || *this || other; + } + template<typename T> + MatchNotOf<T> MatcherBase<T>::operator ! () const { + return MatchNotOf<T>( *this ); + } + + } // namespace Impl + +} // namespace Matchers + +using namespace Matchers; +using Matchers::Impl::MatcherBase; + +} // namespace Catch + +// end catch_matchers.h +// start catch_matchers_exception.hpp + +namespace Catch { +namespace Matchers { +namespace Exception { + +class ExceptionMessageMatcher : public MatcherBase<std::exception> { + std::string m_message; +public: + + ExceptionMessageMatcher(std::string const& message): + m_message(message) + {} + + bool match(std::exception const& ex) const override; + + std::string describe() const override; +}; + +} // namespace Exception + +Exception::ExceptionMessageMatcher Message(std::string const& message); + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_exception.hpp +// start catch_matchers_floating.h + +namespace Catch { +namespace Matchers { + + namespace Floating { + + enum class FloatingPointKind : uint8_t; + + struct WithinAbsMatcher : MatcherBase<double> { + WithinAbsMatcher(double target, double margin); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + double m_margin; + }; + + struct WithinUlpsMatcher : MatcherBase<double> { + WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + uint64_t m_ulps; + FloatingPointKind m_type; + }; + + // Given IEEE-754 format for floats and doubles, we can assume + // that float -> double promotion is lossless. Given this, we can + // assume that if we do the standard relative comparison of + // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get + // the same result if we do this for floats, as if we do this for + // doubles that were promoted from floats. + struct WithinRelMatcher : MatcherBase<double> { + WithinRelMatcher(double target, double epsilon); + bool match(double const& matchee) const override; + std::string describe() const override; + private: + double m_target; + double m_epsilon; + }; + + } // namespace Floating + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff); + Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff); + Floating::WithinAbsMatcher WithinAbs(double target, double margin); + Floating::WithinRelMatcher WithinRel(double target, double eps); + // defaults epsilon to 100*numeric_limits<double>::epsilon() + Floating::WithinRelMatcher WithinRel(double target); + Floating::WithinRelMatcher WithinRel(float target, float eps); + // defaults epsilon to 100*numeric_limits<float>::epsilon() + Floating::WithinRelMatcher WithinRel(float target); + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_floating.h +// start catch_matchers_generic.hpp + +#include <functional> +#include <string> + +namespace Catch { +namespace Matchers { +namespace Generic { + +namespace Detail { + std::string finalizeDescription(const std::string& desc); +} + +template <typename T> +class PredicateMatcher : public MatcherBase<T> { + std::function<bool(T const&)> m_predicate; + std::string m_description; +public: + + PredicateMatcher(std::function<bool(T const&)> const& elem, std::string const& descr) + :m_predicate(std::move(elem)), + m_description(Detail::finalizeDescription(descr)) + {} + + bool match( T const& item ) const override { + return m_predicate(item); + } + + std::string describe() const override { + return m_description; + } +}; + +} // namespace Generic + + // The following functions create the actual matcher objects. + // The user has to explicitly specify type to the function, because + // inferring std::function<bool(T const&)> is hard (but possible) and + // requires a lot of TMP. + template<typename T> + Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)> const& predicate, std::string const& description = "") { + return Generic::PredicateMatcher<T>(predicate, description); + } + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_generic.hpp +// start catch_matchers_string.h + +#include <string> + +namespace Catch { +namespace Matchers { + + namespace StdString { + + struct CasedString + { + CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); + std::string adjustString( std::string const& str ) const; + std::string caseSensitivitySuffix() const; + + CaseSensitive::Choice m_caseSensitivity; + std::string m_str; + }; + + struct StringMatcherBase : MatcherBase<std::string> { + StringMatcherBase( std::string const& operation, CasedString const& comparator ); + std::string describe() const override; + + CasedString m_comparator; + std::string m_operation; + }; + + struct EqualsMatcher : StringMatcherBase { + EqualsMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + struct ContainsMatcher : StringMatcherBase { + ContainsMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + struct StartsWithMatcher : StringMatcherBase { + StartsWithMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + struct EndsWithMatcher : StringMatcherBase { + EndsWithMatcher( CasedString const& comparator ); + bool match( std::string const& source ) const override; + }; + + struct RegexMatcher : MatcherBase<std::string> { + RegexMatcher( std::string regex, CaseSensitive::Choice caseSensitivity ); + bool match( std::string const& matchee ) const override; + std::string describe() const override; + + private: + std::string m_regex; + CaseSensitive::Choice m_caseSensitivity; + }; + + } // namespace StdString + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + StdString::RegexMatcher Matches( std::string const& regex, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_string.h +// start catch_matchers_vector.h + +#include <algorithm> + +namespace Catch { +namespace Matchers { + + namespace Vector { + template<typename T, typename Alloc> + struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> { + + ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} + + bool match(std::vector<T, Alloc> const &v) const override { + for (auto const& el : v) { + if (el == m_comparator) { + return true; + } + } + return false; + } + + std::string describe() const override { + return "Contains: " + ::Catch::Detail::stringify( m_comparator ); + } + + T const& m_comparator; + }; + + template<typename T, typename AllocComp, typename AllocMatch> + struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> { + + ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector<T, AllocMatch> const &v) const override { + // !TBD: see note in EqualsMatcher + if (m_comparator.size() > v.size()) + return false; + for (auto const& comparator : m_comparator) { + auto present = false; + for (const auto& el : v) { + if (el == comparator) { + present = true; + break; + } + } + if (!present) { + return false; + } + } + return true; + } + std::string describe() const override { + return "Contains: " + ::Catch::Detail::stringify( m_comparator ); + } + + std::vector<T, AllocComp> const& m_comparator; + }; + + template<typename T, typename AllocComp, typename AllocMatch> + struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> { + + EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {} + + bool match(std::vector<T, AllocMatch> const &v) const override { + // !TBD: This currently works if all elements can be compared using != + // - a more general approach would be via a compare template that defaults + // to using !=. but could be specialised for, e.g. std::vector<T, Alloc> etc + // - then just call that directly + if (m_comparator.size() != v.size()) + return false; + for (std::size_t i = 0; i < v.size(); ++i) + if (m_comparator[i] != v[i]) + return false; + return true; + } + std::string describe() const override { + return "Equals: " + ::Catch::Detail::stringify( m_comparator ); + } + std::vector<T, AllocComp> const& m_comparator; + }; + + template<typename T, typename AllocComp, typename AllocMatch> + struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> { + + ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_comparator( comparator ) {} + + bool match(std::vector<T, AllocMatch> const &v) const override { + if (m_comparator.size() != v.size()) + return false; + for (std::size_t i = 0; i < v.size(); ++i) + if (m_comparator[i] != approx(v[i])) + return false; + return true; + } + std::string describe() const override { + return "is approx: " + ::Catch::Detail::stringify( m_comparator ); + } + template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + ApproxMatcher& epsilon( T const& newEpsilon ) { + approx.epsilon(newEpsilon); + return *this; + } + template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + ApproxMatcher& margin( T const& newMargin ) { + approx.margin(newMargin); + return *this; + } + template <typename = typename std::enable_if<std::is_constructible<double, T>::value>::type> + ApproxMatcher& scale( T const& newScale ) { + approx.scale(newScale); + return *this; + } + + std::vector<T, AllocComp> const& m_comparator; + mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom(); + }; + + template<typename T, typename AllocComp, typename AllocMatch> + struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> { + UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) : m_target(target) {} + bool match(std::vector<T, AllocMatch> const& vec) const override { + if (m_target.size() != vec.size()) { + return false; + } + return std::is_permutation(m_target.begin(), m_target.end(), vec.begin()); + } + + std::string describe() const override { + return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target); + } + private: + std::vector<T, AllocComp> const& m_target; + }; + + } // namespace Vector + + // The following functions create the actual matcher objects. + // This allows the types to be inferred + + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vector<T, AllocComp> const& comparator ) { + return Vector::ContainsMatcher<T, AllocComp, AllocMatch>( comparator ); + } + + template<typename T, typename Alloc = std::allocator<T>> + Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& comparator ) { + return Vector::ContainsElementMatcher<T, Alloc>( comparator ); + } + + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<T, AllocComp> const& comparator ) { + return Vector::EqualsMatcher<T, AllocComp, AllocMatch>( comparator ); + } + + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<T, AllocComp> const& comparator ) { + return Vector::ApproxMatcher<T, AllocComp, AllocMatch>( comparator ); + } + + template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp> + Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEquals(std::vector<T, AllocComp> const& target) { + return Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>( target ); + } + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_vector.h +namespace Catch { + + template<typename ArgT, typename MatcherT> + class MatchExpr : public ITransientExpression { + ArgT const& m_arg; + MatcherT m_matcher; + StringRef m_matcherString; + public: + MatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString ) + : ITransientExpression{ true, matcher.match( arg ) }, + m_arg( arg ), + m_matcher( matcher ), + m_matcherString( matcherString ) + {} + + void streamReconstructedExpression( std::ostream &os ) const override { + auto matcherAsString = m_matcher.toString(); + os << Catch::Detail::stringify( m_arg ) << ' '; + if( matcherAsString == Detail::unprintableString ) + os << m_matcherString; + else + os << matcherAsString; + } + }; + + using StringMatcher = Matchers::Impl::MatcherBase<std::string>; + + void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString ); + + template<typename ArgT, typename MatcherT> + auto makeMatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const& matcherString ) -> MatchExpr<ArgT, MatcherT> { + return MatchExpr<ArgT, MatcherT>( arg, matcher, matcherString ); + } + +} // namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ + INTERNAL_CATCH_TRY { \ + catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher, #matcher##_catch_sr ) ); \ + } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +/////////////////////////////////////////////////////////////////////////////// +#define INTERNAL_CATCH_THROWS_MATCHES( macroName, exceptionType, resultDisposition, matcher, ... ) \ + do { \ + Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ + if( catchAssertionHandler.allowThrows() ) \ + try { \ + static_cast<void>(__VA_ARGS__ ); \ + catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ + } \ + catch( exceptionType const& ex ) { \ + catchAssertionHandler.handleExpr( Catch::makeMatchExpr( ex, matcher, #matcher##_catch_sr ) ); \ + } \ + catch( ... ) { \ + catchAssertionHandler.handleUnexpectedInflightException(); \ + } \ + else \ + catchAssertionHandler.handleThrowingCallSkipped(); \ + INTERNAL_CATCH_REACT( catchAssertionHandler ) \ + } while( false ) + +// end catch_capture_matchers.h +#endif +// start catch_generators.hpp + +// start catch_interfaces_generatortracker.h + + +#include <memory> + +namespace Catch { + + namespace Generators { + class GeneratorUntypedBase { + public: + GeneratorUntypedBase() = default; + virtual ~GeneratorUntypedBase(); + // Attempts to move the generator to the next element + // + // Returns true iff the move succeeded (and a valid element + // can be retrieved). + virtual bool next() = 0; + }; + using GeneratorBasePtr = std::unique_ptr<GeneratorUntypedBase>; + + } // namespace Generators + + struct IGeneratorTracker { + virtual ~IGeneratorTracker(); + virtual auto hasGenerator() const -> bool = 0; + virtual auto getGenerator() const -> Generators::GeneratorBasePtr const& = 0; + virtual void setGenerator( Generators::GeneratorBasePtr&& generator ) = 0; + }; + +} // namespace Catch + +// end catch_interfaces_generatortracker.h +// start catch_enforce.h + +#include <exception> + +namespace Catch { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + template <typename Ex> + [[noreturn]] + void throw_exception(Ex const& e) { + throw e; + } +#else // ^^ Exceptions are enabled // Exceptions are disabled vv + [[noreturn]] + void throw_exception(std::exception const& e); +#endif + + [[noreturn]] + void throw_logic_error(std::string const& msg); + [[noreturn]] + void throw_domain_error(std::string const& msg); + [[noreturn]] + void throw_runtime_error(std::string const& msg); + +} // namespace Catch; + +#define CATCH_MAKE_MSG(...) \ + (Catch::ReusableStringStream() << __VA_ARGS__).str() + +#define CATCH_INTERNAL_ERROR(...) \ + Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__)) + +#define CATCH_ERROR(...) \ + Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ )) + +#define CATCH_RUNTIME_ERROR(...) \ + Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ )) + +#define CATCH_ENFORCE( condition, ... ) \ + do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false) + +// end catch_enforce.h +#include <memory> +#include <vector> +#include <cassert> + +#include <utility> +#include <exception> + +namespace Catch { + +class GeneratorException : public std::exception { + const char* const m_msg = ""; + +public: + GeneratorException(const char* msg): + m_msg(msg) + {} + + const char* what() const noexcept override final; +}; + +namespace Generators { + + // !TBD move this into its own location? + namespace pf{ + template<typename T, typename... Args> + std::unique_ptr<T> make_unique( Args&&... args ) { + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); + } + } + + template<typename T> + struct IGenerator : GeneratorUntypedBase { + virtual ~IGenerator() = default; + + // Returns the current element of the generator + // + // \Precondition The generator is either freshly constructed, + // or the last call to `next()` returned true + virtual T const& get() const = 0; + using type = T; + }; + + template<typename T> + class SingleValueGenerator final : public IGenerator<T> { + T m_value; + public: + SingleValueGenerator(T&& value) : m_value(std::move(value)) {} + + T const& get() const override { + return m_value; + } + bool next() override { + return false; + } + }; + + template<typename T> + class FixedValuesGenerator final : public IGenerator<T> { + static_assert(!std::is_same<T, bool>::value, + "FixedValuesGenerator does not support bools because of std::vector<bool>" + "specialization, use SingleValue Generator instead."); + std::vector<T> m_values; + size_t m_idx = 0; + public: + FixedValuesGenerator( std::initializer_list<T> values ) : m_values( values ) {} + + T const& get() const override { + return m_values[m_idx]; + } + bool next() override { + ++m_idx; + return m_idx < m_values.size(); + } + }; + + template <typename T> + class GeneratorWrapper final { + std::unique_ptr<IGenerator<T>> m_generator; + public: + GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator): + m_generator(std::move(generator)) + {} + T const& get() const { + return m_generator->get(); + } + bool next() { + return m_generator->next(); + } + }; + + template <typename T> + GeneratorWrapper<T> value(T&& value) { + return GeneratorWrapper<T>(pf::make_unique<SingleValueGenerator<T>>(std::forward<T>(value))); + } + template <typename T> + GeneratorWrapper<T> values(std::initializer_list<T> values) { + return GeneratorWrapper<T>(pf::make_unique<FixedValuesGenerator<T>>(values)); + } + + template<typename T> + class Generators : public IGenerator<T> { + std::vector<GeneratorWrapper<T>> m_generators; + size_t m_current = 0; + + void populate(GeneratorWrapper<T>&& generator) { + m_generators.emplace_back(std::move(generator)); + } + void populate(T&& val) { + m_generators.emplace_back(value(std::forward<T>(val))); + } + template<typename U> + void populate(U&& val) { + populate(T(std::forward<U>(val))); + } + template<typename U, typename... Gs> + void populate(U&& valueOrGenerator, Gs &&... moreGenerators) { + populate(std::forward<U>(valueOrGenerator)); + populate(std::forward<Gs>(moreGenerators)...); + } + + public: + template <typename... Gs> + Generators(Gs &&... moreGenerators) { + m_generators.reserve(sizeof...(Gs)); + populate(std::forward<Gs>(moreGenerators)...); + } + + T const& get() const override { + return m_generators[m_current].get(); + } + + bool next() override { + if (m_current >= m_generators.size()) { + return false; + } + const bool current_status = m_generators[m_current].next(); + if (!current_status) { + ++m_current; + } + return m_current < m_generators.size(); + } + }; + + template<typename... Ts> + GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std::tuple<typename std::decay<Ts>::type...>> tuples ) { + return values<std::tuple<Ts...>>( tuples ); + } + + // Tag type to signal that a generator sequence should convert arguments to a specific type + template <typename T> + struct as {}; + + template<typename T, typename... Gs> + auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreGenerators ) -> Generators<T> { + return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...); + } + template<typename T> + auto makeGenerators( GeneratorWrapper<T>&& generator ) -> Generators<T> { + return Generators<T>(std::move(generator)); + } + template<typename T, typename... Gs> + auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generators<T> { + return makeGenerators( value( std::forward<T>( val ) ), std::forward<Gs>( moreGenerators )... ); + } + template<typename T, typename U, typename... Gs> + auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Generators<T> { + return makeGenerators( value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... ); + } + + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; + + template<typename L> + // Note: The type after -> is weird, because VS2015 cannot parse + // the expression used in the typedef inside, when it is in + // return type. Yeah. + auto generate( StringRef generatorName, SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) { + using UnderlyingType = typename decltype(generatorExpression())::type; + + IGeneratorTracker& tracker = acquireGeneratorTracker( generatorName, lineInfo ); + if (!tracker.hasGenerator()) { + tracker.setGenerator(pf::make_unique<Generators<UnderlyingType>>(generatorExpression())); + } + + auto const& generator = static_cast<IGenerator<UnderlyingType> const&>( *tracker.getGenerator() ); + return generator.get(); + } + +} // namespace Generators +} // namespace Catch + +#define GENERATE( ... ) \ + Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ + CATCH_INTERNAL_LINEINFO, \ + [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) +#define GENERATE_COPY( ... ) \ + Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ + CATCH_INTERNAL_LINEINFO, \ + [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) +#define GENERATE_REF( ... ) \ + Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ + CATCH_INTERNAL_LINEINFO, \ + [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) + +// end catch_generators.hpp +// start catch_generators_generic.hpp + +namespace Catch { +namespace Generators { + + template <typename T> + class TakeGenerator : public IGenerator<T> { + GeneratorWrapper<T> m_generator; + size_t m_returned = 0; + size_t m_target; + public: + TakeGenerator(size_t target, GeneratorWrapper<T>&& generator): + m_generator(std::move(generator)), + m_target(target) + { + assert(target != 0 && "Empty generators are not allowed"); + } + T const& get() const override { + return m_generator.get(); + } + bool next() override { + ++m_returned; + if (m_returned >= m_target) { + return false; + } + + const auto success = m_generator.next(); + // If the underlying generator does not contain enough values + // then we cut short as well + if (!success) { + m_returned = m_target; + } + return success; + } + }; + + template <typename T> + GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& generator) { + return GeneratorWrapper<T>(pf::make_unique<TakeGenerator<T>>(target, std::move(generator))); + } + + template <typename T, typename Predicate> + class FilterGenerator : public IGenerator<T> { + GeneratorWrapper<T> m_generator; + Predicate m_predicate; + public: + template <typename P = Predicate> + FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator): + m_generator(std::move(generator)), + m_predicate(std::forward<P>(pred)) + { + if (!m_predicate(m_generator.get())) { + // It might happen that there are no values that pass the + // filter. In that case we throw an exception. + auto has_initial_value = next(); + if (!has_initial_value) { + Catch::throw_exception(GeneratorException("No valid value found in filtered generator")); + } + } + } + + T const& get() const override { + return m_generator.get(); + } + + bool next() override { + bool success = m_generator.next(); + if (!success) { + return false; + } + while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true); + return success; + } + }; + + template <typename T, typename Predicate> + GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& generator) { + return GeneratorWrapper<T>(std::unique_ptr<IGenerator<T>>(pf::make_unique<FilterGenerator<T, Predicate>>(std::forward<Predicate>(pred), std::move(generator)))); + } + + template <typename T> + class RepeatGenerator : public IGenerator<T> { + static_assert(!std::is_same<T, bool>::value, + "RepeatGenerator currently does not support bools" + "because of std::vector<bool> specialization"); + GeneratorWrapper<T> m_generator; + mutable std::vector<T> m_returned; + size_t m_target_repeats; + size_t m_current_repeat = 0; + size_t m_repeat_index = 0; + public: + RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator): + m_generator(std::move(generator)), + m_target_repeats(repeats) + { + assert(m_target_repeats > 0 && "Repeat generator must repeat at least once"); + } + + T const& get() const override { + if (m_current_repeat == 0) { + m_returned.push_back(m_generator.get()); + return m_returned.back(); + } + return m_returned[m_repeat_index]; + } + + bool next() override { + // There are 2 basic cases: + // 1) We are still reading the generator + // 2) We are reading our own cache + + // In the first case, we need to poke the underlying generator. + // If it happily moves, we are left in that state, otherwise it is time to start reading from our cache + if (m_current_repeat == 0) { + const auto success = m_generator.next(); + if (!success) { + ++m_current_repeat; + } + return m_current_repeat < m_target_repeats; + } + + // In the second case, we need to move indices forward and check that we haven't run up against the end + ++m_repeat_index; + if (m_repeat_index == m_returned.size()) { + m_repeat_index = 0; + ++m_current_repeat; + } + return m_current_repeat < m_target_repeats; + } + }; + + template <typename T> + GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& generator) { + return GeneratorWrapper<T>(pf::make_unique<RepeatGenerator<T>>(repeats, std::move(generator))); + } + + template <typename T, typename U, typename Func> + class MapGenerator : public IGenerator<T> { + // TBD: provide static assert for mapping function, for friendly error message + GeneratorWrapper<U> m_generator; + Func m_function; + // To avoid returning dangling reference, we have to save the values + T m_cache; + public: + template <typename F2 = Func> + MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) : + m_generator(std::move(generator)), + m_function(std::forward<F2>(function)), + m_cache(m_function(m_generator.get())) + {} + + T const& get() const override { + return m_cache; + } + bool next() override { + const auto success = m_generator.next(); + if (success) { + m_cache = m_function(m_generator.get()); + } + return success; + } + }; + + template <typename Func, typename U, typename T = FunctionReturnType<Func, U>> + GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { + return GeneratorWrapper<T>( + pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) + ); + } + + template <typename T, typename U, typename Func> + GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) { + return GeneratorWrapper<T>( + pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator)) + ); + } + + template <typename T> + class ChunkGenerator final : public IGenerator<std::vector<T>> { + std::vector<T> m_chunk; + size_t m_chunk_size; + GeneratorWrapper<T> m_generator; + bool m_used_up = false; + public: + ChunkGenerator(size_t size, GeneratorWrapper<T> generator) : + m_chunk_size(size), m_generator(std::move(generator)) + { + m_chunk.reserve(m_chunk_size); + if (m_chunk_size != 0) { + m_chunk.push_back(m_generator.get()); + for (size_t i = 1; i < m_chunk_size; ++i) { + if (!m_generator.next()) { + Catch::throw_exception(GeneratorException("Not enough values to initialize the first chunk")); + } + m_chunk.push_back(m_generator.get()); + } + } + } + std::vector<T> const& get() const override { + return m_chunk; + } + bool next() override { + m_chunk.clear(); + for (size_t idx = 0; idx < m_chunk_size; ++idx) { + if (!m_generator.next()) { + return false; + } + m_chunk.push_back(m_generator.get()); + } + return true; + } + }; + + template <typename T> + GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper<T>&& generator) { + return GeneratorWrapper<std::vector<T>>( + pf::make_unique<ChunkGenerator<T>>(size, std::move(generator)) + ); + } + +} // namespace Generators +} // namespace Catch + +// end catch_generators_generic.hpp +// start catch_generators_specific.hpp + +// start catch_context.h + +#include <memory> + +namespace Catch { + + struct IResultCapture; + struct IRunner; + struct IConfig; + struct IMutableContext; + + using IConfigPtr = std::shared_ptr<IConfig const>; + + struct IContext + { + virtual ~IContext(); + + virtual IResultCapture* getResultCapture() = 0; + virtual IRunner* getRunner() = 0; + virtual IConfigPtr const& getConfig() const = 0; + }; + + struct IMutableContext : IContext + { + virtual ~IMutableContext(); + virtual void setResultCapture( IResultCapture* resultCapture ) = 0; + virtual void setRunner( IRunner* runner ) = 0; + virtual void setConfig( IConfigPtr const& config ) = 0; + + private: + static IMutableContext *currentContext; + friend IMutableContext& getCurrentMutableContext(); + friend void cleanUpContext(); + static void createContext(); + }; + + inline IMutableContext& getCurrentMutableContext() + { + if( !IMutableContext::currentContext ) + IMutableContext::createContext(); + // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn) + return *IMutableContext::currentContext; + } + + inline IContext& getCurrentContext() + { + return getCurrentMutableContext(); + } + + void cleanUpContext(); + + class SimplePcg32; + SimplePcg32& rng(); +} + +// end catch_context.h +// start catch_interfaces_config.h + +// start catch_option.hpp + +namespace Catch { + + // An optional type + template<typename T> + class Option { + public: + Option() : nullableValue( nullptr ) {} + Option( T const& _value ) + : nullableValue( new( storage ) T( _value ) ) + {} + Option( Option const& _other ) + : nullableValue( _other ? new( storage ) T( *_other ) : nullptr ) + {} + + ~Option() { + reset(); + } + + Option& operator= ( Option const& _other ) { + if( &_other != this ) { + reset(); + if( _other ) + nullableValue = new( storage ) T( *_other ); + } + return *this; + } + Option& operator = ( T const& _value ) { + reset(); + nullableValue = new( storage ) T( _value ); + return *this; + } + + void reset() { + if( nullableValue ) + nullableValue->~T(); + nullableValue = nullptr; + } + + T& operator*() { return *nullableValue; } + T const& operator*() const { return *nullableValue; } + T* operator->() { return nullableValue; } + const T* operator->() const { return nullableValue; } + + T valueOr( T const& defaultValue ) const { + return nullableValue ? *nullableValue : defaultValue; + } + + bool some() const { return nullableValue != nullptr; } + bool none() const { return nullableValue == nullptr; } + + bool operator !() const { return nullableValue == nullptr; } + explicit operator bool() const { + return some(); + } + + private: + T *nullableValue; + alignas(alignof(T)) char storage[sizeof(T)]; + }; + +} // end namespace Catch + +// end catch_option.hpp +#include <chrono> +#include <iosfwd> +#include <string> +#include <vector> +#include <memory> + +namespace Catch { + + enum class Verbosity { + Quiet = 0, + Normal, + High + }; + + struct WarnAbout { enum What { + Nothing = 0x00, + NoAssertions = 0x01, + NoTests = 0x02 + }; }; + + struct ShowDurations { enum OrNot { + DefaultForReporter, + Always, + Never + }; }; + struct RunTests { enum InWhatOrder { + InDeclarationOrder, + InLexicographicalOrder, + InRandomOrder + }; }; + struct UseColour { enum YesOrNo { + Auto, + Yes, + No + }; }; + struct WaitForKeypress { enum When { + Never, + BeforeStart = 1, + BeforeExit = 2, + BeforeStartAndExit = BeforeStart | BeforeExit + }; }; + + class TestSpec; + + struct IConfig : NonCopyable { + + virtual ~IConfig(); + + virtual bool allowThrows() const = 0; + virtual std::ostream& stream() const = 0; + virtual std::string name() const = 0; + virtual bool includeSuccessfulResults() const = 0; + virtual bool shouldDebugBreak() const = 0; + virtual bool warnAboutMissingAssertions() const = 0; + virtual bool warnAboutNoTests() const = 0; + virtual int abortAfter() const = 0; + virtual bool showInvisibles() const = 0; + virtual ShowDurations::OrNot showDurations() const = 0; + virtual double minDuration() const = 0; + virtual TestSpec const& testSpec() const = 0; + virtual bool hasTestFilters() const = 0; + virtual std::vector<std::string> const& getTestsOrTags() const = 0; + virtual RunTests::InWhatOrder runOrder() const = 0; + virtual unsigned int rngSeed() const = 0; + virtual UseColour::YesOrNo useColour() const = 0; + virtual std::vector<std::string> const& getSectionsToRun() const = 0; + virtual Verbosity verbosity() const = 0; + + virtual bool benchmarkNoAnalysis() const = 0; + virtual int benchmarkSamples() const = 0; + virtual double benchmarkConfidenceInterval() const = 0; + virtual unsigned int benchmarkResamples() const = 0; + virtual std::chrono::milliseconds benchmarkWarmupTime() const = 0; + }; + + using IConfigPtr = std::shared_ptr<IConfig const>; +} + +// end catch_interfaces_config.h +// start catch_random_number_generator.h + +#include <cstdint> + +namespace Catch { + + // This is a simple implementation of C++11 Uniform Random Number + // Generator. It does not provide all operators, because Catch2 + // does not use it, but it should behave as expected inside stdlib's + // distributions. + // The implementation is based on the PCG family (http://pcg-random.org) + class SimplePcg32 { + using state_type = std::uint64_t; + public: + using result_type = std::uint32_t; + static constexpr result_type (min)() { + return 0; + } + static constexpr result_type (max)() { + return static_cast<result_type>(-1); + } + + // Provide some default initial state for the default constructor + SimplePcg32():SimplePcg32(0xed743cc4U) {} + + explicit SimplePcg32(result_type seed_); + + void seed(result_type seed_); + void discard(uint64_t skip); + + result_type operator()(); + + private: + friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs); + friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs); + + // In theory we also need operator<< and operator>> + // In practice we do not use them, so we will skip them for now + + std::uint64_t m_state; + // This part of the state determines which "stream" of the numbers + // is chosen -- we take it as a constant for Catch2, so we only + // need to deal with seeding the main state. + // Picked by reading 8 bytes from `/dev/random` :-) + static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL; + }; + +} // end namespace Catch + +// end catch_random_number_generator.h +#include <random> + +namespace Catch { +namespace Generators { + +template <typename Float> +class RandomFloatingGenerator final : public IGenerator<Float> { + Catch::SimplePcg32& m_rng; + std::uniform_real_distribution<Float> m_dist; + Float m_current_number; +public: + + RandomFloatingGenerator(Float a, Float b): + m_rng(rng()), + m_dist(a, b) { + static_cast<void>(next()); + } + + Float const& get() const override { + return m_current_number; + } + bool next() override { + m_current_number = m_dist(m_rng); + return true; + } +}; + +template <typename Integer> +class RandomIntegerGenerator final : public IGenerator<Integer> { + Catch::SimplePcg32& m_rng; + std::uniform_int_distribution<Integer> m_dist; + Integer m_current_number; +public: + + RandomIntegerGenerator(Integer a, Integer b): + m_rng(rng()), + m_dist(a, b) { + static_cast<void>(next()); + } + + Integer const& get() const override { + return m_current_number; + } + bool next() override { + m_current_number = m_dist(m_rng); + return true; + } +}; + +// TODO: Ideally this would be also constrained against the various char types, +// but I don't expect users to run into that in practice. +template <typename T> +typename std::enable_if<std::is_integral<T>::value && !std::is_same<T, bool>::value, +GeneratorWrapper<T>>::type +random(T a, T b) { + return GeneratorWrapper<T>( + pf::make_unique<RandomIntegerGenerator<T>>(a, b) + ); +} + +template <typename T> +typename std::enable_if<std::is_floating_point<T>::value, +GeneratorWrapper<T>>::type +random(T a, T b) { + return GeneratorWrapper<T>( + pf::make_unique<RandomFloatingGenerator<T>>(a, b) + ); +} + +template <typename T> +class RangeGenerator final : public IGenerator<T> { + T m_current; + T m_end; + T m_step; + bool m_positive; + +public: + RangeGenerator(T const& start, T const& end, T const& step): + m_current(start), + m_end(end), + m_step(step), + m_positive(m_step > T(0)) + { + assert(m_current != m_end && "Range start and end cannot be equal"); + assert(m_step != T(0) && "Step size cannot be zero"); + assert(((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) && "Step moves away from end"); + } + + RangeGenerator(T const& start, T const& end): + RangeGenerator(start, end, (start < end) ? T(1) : T(-1)) + {} + + T const& get() const override { + return m_current; + } + + bool next() override { + m_current += m_step; + return (m_positive) ? (m_current < m_end) : (m_current > m_end); + } +}; + +template <typename T> +GeneratorWrapper<T> range(T const& start, T const& end, T const& step) { + static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, "Type must be numeric"); + return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step)); +} + +template <typename T> +GeneratorWrapper<T> range(T const& start, T const& end) { + static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, "Type must be an integer"); + return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end)); +} + +template <typename T> +class IteratorGenerator final : public IGenerator<T> { + static_assert(!std::is_same<T, bool>::value, + "IteratorGenerator currently does not support bools" + "because of std::vector<bool> specialization"); + + std::vector<T> m_elems; + size_t m_current = 0; +public: + template <typename InputIterator, typename InputSentinel> + IteratorGenerator(InputIterator first, InputSentinel last):m_elems(first, last) { + if (m_elems.empty()) { + Catch::throw_exception(GeneratorException("IteratorGenerator received no valid values")); + } + } + + T const& get() const override { + return m_elems[m_current]; + } + + bool next() override { + ++m_current; + return m_current != m_elems.size(); + } +}; + +template <typename InputIterator, + typename InputSentinel, + typename ResultType = typename std::iterator_traits<InputIterator>::value_type> +GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) { + return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(from, to)); +} + +template <typename Container, + typename ResultType = typename Container::value_type> +GeneratorWrapper<ResultType> from_range(Container const& cnt) { + return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end())); +} + +} // namespace Generators +} // namespace Catch + +// end catch_generators_specific.hpp + +// These files are included here so the single_include script doesn't put them +// in the conditionally compiled sections +// start catch_test_case_info.h + +#include <string> +#include <vector> +#include <memory> + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +namespace Catch { + + struct ITestInvoker; + + struct TestCaseInfo { + enum SpecialProperties{ + None = 0, + IsHidden = 1 << 1, + ShouldFail = 1 << 2, + MayFail = 1 << 3, + Throws = 1 << 4, + NonPortable = 1 << 5, + Benchmark = 1 << 6 + }; + + TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::vector<std::string> const& _tags, + SourceLineInfo const& _lineInfo ); + + friend void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags ); + + bool isHidden() const; + bool throws() const; + bool okToFail() const; + bool expectedToFail() const; + + std::string tagsAsString() const; + + std::string name; + std::string className; + std::string description; + std::vector<std::string> tags; + std::vector<std::string> lcaseTags; + SourceLineInfo lineInfo; + SpecialProperties properties; + }; + + class TestCase : public TestCaseInfo { + public: + + TestCase( ITestInvoker* testCase, TestCaseInfo&& info ); + + TestCase withName( std::string const& _newName ) const; + + void invoke() const; + + TestCaseInfo const& getTestCaseInfo() const; + + bool operator == ( TestCase const& other ) const; + bool operator < ( TestCase const& other ) const; + + private: + std::shared_ptr<ITestInvoker> test; + }; + + TestCase makeTestCase( ITestInvoker* testCase, + std::string const& className, + NameAndTags const& nameAndTags, + SourceLineInfo const& lineInfo ); +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// end catch_test_case_info.h +// start catch_interfaces_runner.h + +namespace Catch { + + struct IRunner { + virtual ~IRunner(); + virtual bool aborting() const = 0; + }; +} + +// end catch_interfaces_runner.h + +#ifdef __OBJC__ +// start catch_objc.hpp + +#import <objc/runtime.h> + +#include <string> + +// NB. Any general catch headers included here must be included +// in catch.hpp first to make sure they are included by the single +// header for non obj-usage + +/////////////////////////////////////////////////////////////////////////////// +// This protocol is really only here for (self) documenting purposes, since +// all its methods are optional. +@protocol OcFixture + +@optional + +-(void) setUp; +-(void) tearDown; + +@end + +namespace Catch { + + class OcMethod : public ITestInvoker { + + public: + OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} + + virtual void invoke() const { + id obj = [[m_cls alloc] init]; + + performOptionalSelector( obj, @selector(setUp) ); + performOptionalSelector( obj, m_sel ); + performOptionalSelector( obj, @selector(tearDown) ); + + arcSafeRelease( obj ); + } + private: + virtual ~OcMethod() {} + + Class m_cls; + SEL m_sel; + }; + + namespace Detail{ + + inline std::string getAnnotation( Class cls, + std::string const& annotationName, + std::string const& testCaseName ) { + NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; + SEL sel = NSSelectorFromString( selStr ); + arcSafeRelease( selStr ); + id value = performOptionalSelector( cls, sel ); + if( value ) + return [(NSString*)value UTF8String]; + return ""; + } + } + + inline std::size_t registerTestMethods() { + std::size_t noTestMethods = 0; + int noClasses = objc_getClassList( nullptr, 0 ); + + Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); + objc_getClassList( classes, noClasses ); + + for( int c = 0; c < noClasses; c++ ) { + Class cls = classes[c]; + { + u_int count; + Method* methods = class_copyMethodList( cls, &count ); + for( u_int m = 0; m < count ; m++ ) { + SEL selector = method_getName(methods[m]); + std::string methodName = sel_getName(selector); + if( startsWith( methodName, "Catch_TestCase_" ) ) { + std::string testCaseName = methodName.substr( 15 ); + std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); + std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); + const char* className = class_getName( cls ); + + getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, NameAndTags( name.c_str(), desc.c_str() ), SourceLineInfo("",0) ) ); + noTestMethods++; + } + } + free(methods); + } + } + return noTestMethods; + } + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) + + namespace Matchers { + namespace Impl { + namespace NSStringMatchers { + + struct StringHolder : MatcherBase<NSString*>{ + StringHolder( NSString* substr ) : m_substr( [substr copy] ){} + StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} + StringHolder() { + arcSafeRelease( m_substr ); + } + + bool match( NSString* str ) const override { + return false; + } + + NSString* CATCH_ARC_STRONG m_substr; + }; + + struct Equals : StringHolder { + Equals( NSString* substr ) : StringHolder( substr ){} + + bool match( NSString* str ) const override { + return (str != nil || m_substr == nil ) && + [str isEqualToString:m_substr]; + } + + std::string describe() const override { + return "equals string: " + Catch::Detail::stringify( m_substr ); + } + }; + + struct Contains : StringHolder { + Contains( NSString* substr ) : StringHolder( substr ){} + + bool match( NSString* str ) const override { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location != NSNotFound; + } + + std::string describe() const override { + return "contains string: " + Catch::Detail::stringify( m_substr ); + } + }; + + struct StartsWith : StringHolder { + StartsWith( NSString* substr ) : StringHolder( substr ){} + + bool match( NSString* str ) const override { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == 0; + } + + std::string describe() const override { + return "starts with: " + Catch::Detail::stringify( m_substr ); + } + }; + struct EndsWith : StringHolder { + EndsWith( NSString* substr ) : StringHolder( substr ){} + + bool match( NSString* str ) const override { + return (str != nil || m_substr == nil ) && + [str rangeOfString:m_substr].location == [str length] - [m_substr length]; + } + + std::string describe() const override { + return "ends with: " + Catch::Detail::stringify( m_substr ); + } + }; + + } // namespace NSStringMatchers + } // namespace Impl + + inline Impl::NSStringMatchers::Equals + Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } + + inline Impl::NSStringMatchers::Contains + Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } + + inline Impl::NSStringMatchers::StartsWith + StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } + + inline Impl::NSStringMatchers::EndsWith + EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } + + } // namespace Matchers + + using namespace Matchers; + +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +} // namespace Catch + +/////////////////////////////////////////////////////////////////////////////// +#define OC_MAKE_UNIQUE_NAME( root, uniqueSuffix ) root##uniqueSuffix +#define OC_TEST_CASE2( name, desc, uniqueSuffix ) \ ++(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Name_test_, uniqueSuffix ) \ +{ \ +return @ name; \ +} \ ++(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Description_test_, uniqueSuffix ) \ +{ \ +return @ desc; \ +} \ +-(void) OC_MAKE_UNIQUE_NAME( Catch_TestCase_test_, uniqueSuffix ) + +#define OC_TEST_CASE( name, desc ) OC_TEST_CASE2( name, desc, __LINE__ ) + +// end catch_objc.hpp +#endif + +// Benchmarking needs the externally-facing parts of reporters to work +#if defined(CATCH_CONFIG_EXTERNAL_INTERFACES) || defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +// start catch_external_interfaces.h + +// start catch_reporter_bases.hpp + +// start catch_interfaces_reporter.h + +// start catch_config.hpp + +// start catch_test_spec_parser.h + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +// start catch_test_spec.h + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +#endif + +// start catch_wildcard_pattern.h + +namespace Catch +{ + class WildcardPattern { + enum WildcardPosition { + NoWildcard = 0, + WildcardAtStart = 1, + WildcardAtEnd = 2, + WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd + }; + + public: + + WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ); + virtual ~WildcardPattern() = default; + virtual bool matches( std::string const& str ) const; + + private: + std::string normaliseString( std::string const& str ) const; + CaseSensitive::Choice m_caseSensitivity; + WildcardPosition m_wildcard = NoWildcard; + std::string m_pattern; + }; +} + +// end catch_wildcard_pattern.h +#include <string> +#include <vector> +#include <memory> + +namespace Catch { + + struct IConfig; + + class TestSpec { + class Pattern { + public: + explicit Pattern( std::string const& name ); + virtual ~Pattern(); + virtual bool matches( TestCaseInfo const& testCase ) const = 0; + std::string const& name() const; + private: + std::string const m_name; + }; + using PatternPtr = std::shared_ptr<Pattern>; + + class NamePattern : public Pattern { + public: + explicit NamePattern( std::string const& name, std::string const& filterString ); + bool matches( TestCaseInfo const& testCase ) const override; + private: + WildcardPattern m_wildcardPattern; + }; + + class TagPattern : public Pattern { + public: + explicit TagPattern( std::string const& tag, std::string const& filterString ); + bool matches( TestCaseInfo const& testCase ) const override; + private: + std::string m_tag; + }; + + class ExcludedPattern : public Pattern { + public: + explicit ExcludedPattern( PatternPtr const& underlyingPattern ); + bool matches( TestCaseInfo const& testCase ) const override; + private: + PatternPtr m_underlyingPattern; + }; + + struct Filter { + std::vector<PatternPtr> m_patterns; + + bool matches( TestCaseInfo const& testCase ) const; + std::string name() const; + }; + + public: + struct FilterMatch { + std::string name; + std::vector<TestCase const*> tests; + }; + using Matches = std::vector<FilterMatch>; + using vectorStrings = std::vector<std::string>; + + bool hasFilters() const; + bool matches( TestCaseInfo const& testCase ) const; + Matches matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const; + const vectorStrings & getInvalidArgs() const; + + private: + std::vector<Filter> m_filters; + std::vector<std::string> m_invalidArgs; + friend class TestSpecParser; + }; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// end catch_test_spec.h +// start catch_interfaces_tag_alias_registry.h + +#include <string> + +namespace Catch { + + struct TagAlias; + + struct ITagAliasRegistry { + virtual ~ITagAliasRegistry(); + // Nullptr if not present + virtual TagAlias const* find( std::string const& alias ) const = 0; + virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; + + static ITagAliasRegistry const& get(); + }; + +} // end namespace Catch + +// end catch_interfaces_tag_alias_registry.h +namespace Catch { + + class TestSpecParser { + enum Mode{ None, Name, QuotedName, Tag, EscapedName }; + Mode m_mode = None; + Mode lastMode = None; + bool m_exclusion = false; + std::size_t m_pos = 0; + std::size_t m_realPatternPos = 0; + std::string m_arg; + std::string m_substring; + std::string m_patternName; + std::vector<std::size_t> m_escapeChars; + TestSpec::Filter m_currentFilter; + TestSpec m_testSpec; + ITagAliasRegistry const* m_tagAliases = nullptr; + + public: + TestSpecParser( ITagAliasRegistry const& tagAliases ); + + TestSpecParser& parse( std::string const& arg ); + TestSpec testSpec(); + + private: + bool visitChar( char c ); + void startNewMode( Mode mode ); + bool processNoneChar( char c ); + void processNameChar( char c ); + bool processOtherChar( char c ); + void endMode(); + void escape(); + bool isControlChar( char c ) const; + void saveLastMode(); + void revertBackToLastMode(); + void addFilter(); + bool separate(); + + // Handles common preprocessing of the pattern for name/tag patterns + std::string preprocessPattern(); + // Adds the current pattern as a test name + void addNamePattern(); + // Adds the current pattern as a tag + void addTagPattern(); + + inline void addCharToPattern(char c) { + m_substring += c; + m_patternName += c; + m_realPatternPos++; + } + + }; + TestSpec parseTestSpec( std::string const& arg ); + +} // namespace Catch + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// end catch_test_spec_parser.h +// Libstdc++ doesn't like incomplete classes for unique_ptr + +#include <memory> +#include <vector> +#include <string> + +#ifndef CATCH_CONFIG_CONSOLE_WIDTH +#define CATCH_CONFIG_CONSOLE_WIDTH 80 +#endif + +namespace Catch { + + struct IStream; + + struct ConfigData { + bool listTests = false; + bool listTags = false; + bool listReporters = false; + bool listTestNamesOnly = false; + + bool showSuccessfulTests = false; + bool shouldDebugBreak = false; + bool noThrow = false; + bool showHelp = false; + bool showInvisibles = false; + bool filenamesAsTags = false; + bool libIdentify = false; + + int abortAfter = -1; + unsigned int rngSeed = 0; + + bool benchmarkNoAnalysis = false; + unsigned int benchmarkSamples = 100; + double benchmarkConfidenceInterval = 0.95; + unsigned int benchmarkResamples = 100000; + std::chrono::milliseconds::rep benchmarkWarmupTime = 100; + + Verbosity verbosity = Verbosity::Normal; + WarnAbout::What warnings = WarnAbout::Nothing; + ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter; + double minDuration = -1; + RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder; + UseColour::YesOrNo useColour = UseColour::Auto; + WaitForKeypress::When waitForKeypress = WaitForKeypress::Never; + + std::string outputFilename; + std::string name; + std::string processName; +#ifndef CATCH_CONFIG_DEFAULT_REPORTER +#define CATCH_CONFIG_DEFAULT_REPORTER "console" +#endif + std::string reporterName = CATCH_CONFIG_DEFAULT_REPORTER; +#undef CATCH_CONFIG_DEFAULT_REPORTER + + std::vector<std::string> testsOrTags; + std::vector<std::string> sectionsToRun; + }; + + class Config : public IConfig { + public: + + Config() = default; + Config( ConfigData const& data ); + virtual ~Config() = default; + + std::string const& getFilename() const; + + bool listTests() const; + bool listTestNamesOnly() const; + bool listTags() const; + bool listReporters() const; + + std::string getProcessName() const; + std::string const& getReporterName() const; + + std::vector<std::string> const& getTestsOrTags() const override; + std::vector<std::string> const& getSectionsToRun() const override; + + TestSpec const& testSpec() const override; + bool hasTestFilters() const override; + + bool showHelp() const; + + // IConfig interface + bool allowThrows() const override; + std::ostream& stream() const override; + std::string name() const override; + bool includeSuccessfulResults() const override; + bool warnAboutMissingAssertions() const override; + bool warnAboutNoTests() const override; + ShowDurations::OrNot showDurations() const override; + double minDuration() const override; + RunTests::InWhatOrder runOrder() const override; + unsigned int rngSeed() const override; + UseColour::YesOrNo useColour() const override; + bool shouldDebugBreak() const override; + int abortAfter() const override; + bool showInvisibles() const override; + Verbosity verbosity() const override; + bool benchmarkNoAnalysis() const override; + int benchmarkSamples() const override; + double benchmarkConfidenceInterval() const override; + unsigned int benchmarkResamples() const override; + std::chrono::milliseconds benchmarkWarmupTime() const override; + + private: + + IStream const* openStream(); + ConfigData m_data; + + std::unique_ptr<IStream const> m_stream; + TestSpec m_testSpec; + bool m_hasTestFilters = false; + }; + +} // end namespace Catch + +// end catch_config.hpp +// start catch_assertionresult.h + +#include <string> + +namespace Catch { + + struct AssertionResultData + { + AssertionResultData() = delete; + + AssertionResultData( ResultWas::OfType _resultType, LazyExpression const& _lazyExpression ); + + std::string message; + mutable std::string reconstructedExpression; + LazyExpression lazyExpression; + ResultWas::OfType resultType; + + std::string reconstructExpression() const; + }; + + class AssertionResult { + public: + AssertionResult() = delete; + AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); + + bool isOk() const; + bool succeeded() const; + ResultWas::OfType getResultType() const; + bool hasExpression() const; + bool hasMessage() const; + std::string getExpression() const; + std::string getExpressionInMacro() const; + bool hasExpandedExpression() const; + std::string getExpandedExpression() const; + std::string getMessage() const; + SourceLineInfo getSourceInfo() const; + StringRef getTestMacroName() const; + + //protected: + AssertionInfo m_info; + AssertionResultData m_resultData; + }; + +} // end namespace Catch + +// end catch_assertionresult.h +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +// start catch_estimate.hpp + + // Statistics estimates + + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct Estimate { + Duration point; + Duration lower_bound; + Duration upper_bound; + double confidence_interval; + + template <typename Duration2> + operator Estimate<Duration2>() const { + return { point, lower_bound, upper_bound, confidence_interval }; + } + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_estimate.hpp +// start catch_outlier_classification.hpp + +// Outlier information + +namespace Catch { + namespace Benchmark { + struct OutlierClassification { + int samples_seen = 0; + int low_severe = 0; // more than 3 times IQR below Q1 + int low_mild = 0; // 1.5 to 3 times IQR below Q1 + int high_mild = 0; // 1.5 to 3 times IQR above Q3 + int high_severe = 0; // more than 3 times IQR above Q3 + + int total() const { + return low_severe + low_mild + high_mild + high_severe; + } + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_outlier_classification.hpp +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + +#include <string> +#include <iosfwd> +#include <map> +#include <set> +#include <memory> +#include <algorithm> + +namespace Catch { + + struct ReporterConfig { + explicit ReporterConfig( IConfigPtr const& _fullConfig ); + + ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream ); + + std::ostream& stream() const; + IConfigPtr fullConfig() const; + + private: + std::ostream* m_stream; + IConfigPtr m_fullConfig; + }; + + struct ReporterPreferences { + bool shouldRedirectStdOut = false; + bool shouldReportAllAssertions = false; + }; + + template<typename T> + struct LazyStat : Option<T> { + LazyStat& operator=( T const& _value ) { + Option<T>::operator=( _value ); + used = false; + return *this; + } + void reset() { + Option<T>::reset(); + used = false; + } + bool used = false; + }; + + struct TestRunInfo { + TestRunInfo( std::string const& _name ); + std::string name; + }; + struct GroupInfo { + GroupInfo( std::string const& _name, + std::size_t _groupIndex, + std::size_t _groupsCount ); + + std::string name; + std::size_t groupIndex; + std::size_t groupsCounts; + }; + + struct AssertionStats { + AssertionStats( AssertionResult const& _assertionResult, + std::vector<MessageInfo> const& _infoMessages, + Totals const& _totals ); + + AssertionStats( AssertionStats const& ) = default; + AssertionStats( AssertionStats && ) = default; + AssertionStats& operator = ( AssertionStats const& ) = delete; + AssertionStats& operator = ( AssertionStats && ) = delete; + virtual ~AssertionStats(); + + AssertionResult assertionResult; + std::vector<MessageInfo> infoMessages; + Totals totals; + }; + + struct SectionStats { + SectionStats( SectionInfo const& _sectionInfo, + Counts const& _assertions, + double _durationInSeconds, + bool _missingAssertions ); + SectionStats( SectionStats const& ) = default; + SectionStats( SectionStats && ) = default; + SectionStats& operator = ( SectionStats const& ) = default; + SectionStats& operator = ( SectionStats && ) = default; + virtual ~SectionStats(); + + SectionInfo sectionInfo; + Counts assertions; + double durationInSeconds; + bool missingAssertions; + }; + + struct TestCaseStats { + TestCaseStats( TestCaseInfo const& _testInfo, + Totals const& _totals, + std::string const& _stdOut, + std::string const& _stdErr, + bool _aborting ); + + TestCaseStats( TestCaseStats const& ) = default; + TestCaseStats( TestCaseStats && ) = default; + TestCaseStats& operator = ( TestCaseStats const& ) = default; + TestCaseStats& operator = ( TestCaseStats && ) = default; + virtual ~TestCaseStats(); + + TestCaseInfo testInfo; + Totals totals; + std::string stdOut; + std::string stdErr; + bool aborting; + }; + + struct TestGroupStats { + TestGroupStats( GroupInfo const& _groupInfo, + Totals const& _totals, + bool _aborting ); + TestGroupStats( GroupInfo const& _groupInfo ); + + TestGroupStats( TestGroupStats const& ) = default; + TestGroupStats( TestGroupStats && ) = default; + TestGroupStats& operator = ( TestGroupStats const& ) = default; + TestGroupStats& operator = ( TestGroupStats && ) = default; + virtual ~TestGroupStats(); + + GroupInfo groupInfo; + Totals totals; + bool aborting; + }; + + struct TestRunStats { + TestRunStats( TestRunInfo const& _runInfo, + Totals const& _totals, + bool _aborting ); + + TestRunStats( TestRunStats const& ) = default; + TestRunStats( TestRunStats && ) = default; + TestRunStats& operator = ( TestRunStats const& ) = default; + TestRunStats& operator = ( TestRunStats && ) = default; + virtual ~TestRunStats(); + + TestRunInfo runInfo; + Totals totals; + bool aborting; + }; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + struct BenchmarkInfo { + std::string name; + double estimatedDuration; + int iterations; + int samples; + unsigned int resamples; + double clockResolution; + double clockCost; + }; + + template <class Duration> + struct BenchmarkStats { + BenchmarkInfo info; + + std::vector<Duration> samples; + Benchmark::Estimate<Duration> mean; + Benchmark::Estimate<Duration> standardDeviation; + Benchmark::OutlierClassification outliers; + double outlierVariance; + + template <typename Duration2> + operator BenchmarkStats<Duration2>() const { + std::vector<Duration2> samples2; + samples2.reserve(samples.size()); + std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); }); + return { + info, + std::move(samples2), + mean, + standardDeviation, + outliers, + outlierVariance, + }; + } + }; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + struct IStreamingReporter { + virtual ~IStreamingReporter() = default; + + // Implementing class must also provide the following static methods: + // static std::string getDescription(); + // static std::set<Verbosity> getSupportedVerbosities() + + virtual ReporterPreferences getPreferences() const = 0; + + virtual void noMatchingTestCases( std::string const& spec ) = 0; + + virtual void reportInvalidArguments(std::string const&) {} + + virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; + virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; + + virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; + virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + virtual void benchmarkPreparing( std::string const& ) {} + virtual void benchmarkStarting( BenchmarkInfo const& ) {} + virtual void benchmarkEnded( BenchmarkStats<> const& ) {} + virtual void benchmarkFailed( std::string const& ) {} +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; + + // The return value indicates if the messages buffer should be cleared: + virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; + + virtual void sectionEnded( SectionStats const& sectionStats ) = 0; + virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; + virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; + virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; + + virtual void skipTest( TestCaseInfo const& testInfo ) = 0; + + // Default empty implementation provided + virtual void fatalErrorEncountered( StringRef name ); + + virtual bool isMulti() const; + }; + using IStreamingReporterPtr = std::unique_ptr<IStreamingReporter>; + + struct IReporterFactory { + virtual ~IReporterFactory(); + virtual IStreamingReporterPtr create( ReporterConfig const& config ) const = 0; + virtual std::string getDescription() const = 0; + }; + using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>; + + struct IReporterRegistry { + using FactoryMap = std::map<std::string, IReporterFactoryPtr>; + using Listeners = std::vector<IReporterFactoryPtr>; + + virtual ~IReporterRegistry(); + virtual IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const = 0; + virtual FactoryMap const& getFactories() const = 0; + virtual Listeners const& getListeners() const = 0; + }; + +} // end namespace Catch + +// end catch_interfaces_reporter.h +#include <algorithm> +#include <cstring> +#include <cfloat> +#include <cstdio> +#include <cassert> +#include <memory> +#include <ostream> + +namespace Catch { + void prepareExpandedExpression(AssertionResult& result); + + // Returns double formatted as %.3f (format expected on output) + std::string getFormattedDuration( double duration ); + + //! Should the reporter show + bool shouldShowDuration( IConfig const& config, double duration ); + + std::string serializeFilters( std::vector<std::string> const& container ); + + template<typename DerivedT> + struct StreamingReporterBase : IStreamingReporter { + + StreamingReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = false; + if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) + CATCH_ERROR( "Verbosity level not supported by this reporter" ); + } + + ReporterPreferences getPreferences() const override { + return m_reporterPrefs; + } + + static std::set<Verbosity> getSupportedVerbosities() { + return { Verbosity::Normal }; + } + + ~StreamingReporterBase() override = default; + + void noMatchingTestCases(std::string const&) override {} + + void reportInvalidArguments(std::string const&) override {} + + void testRunStarting(TestRunInfo const& _testRunInfo) override { + currentTestRunInfo = _testRunInfo; + } + + void testGroupStarting(GroupInfo const& _groupInfo) override { + currentGroupInfo = _groupInfo; + } + + void testCaseStarting(TestCaseInfo const& _testInfo) override { + currentTestCaseInfo = _testInfo; + } + void sectionStarting(SectionInfo const& _sectionInfo) override { + m_sectionStack.push_back(_sectionInfo); + } + + void sectionEnded(SectionStats const& /* _sectionStats */) override { + m_sectionStack.pop_back(); + } + void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override { + currentTestCaseInfo.reset(); + } + void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override { + currentGroupInfo.reset(); + } + void testRunEnded(TestRunStats const& /* _testRunStats */) override { + currentTestCaseInfo.reset(); + currentGroupInfo.reset(); + currentTestRunInfo.reset(); + } + + void skipTest(TestCaseInfo const&) override { + // Don't do anything with this by default. + // It can optionally be overridden in the derived class. + } + + IConfigPtr m_config; + std::ostream& stream; + + LazyStat<TestRunInfo> currentTestRunInfo; + LazyStat<GroupInfo> currentGroupInfo; + LazyStat<TestCaseInfo> currentTestCaseInfo; + + std::vector<SectionInfo> m_sectionStack; + ReporterPreferences m_reporterPrefs; + }; + + template<typename DerivedT> + struct CumulativeReporterBase : IStreamingReporter { + template<typename T, typename ChildNodeT> + struct Node { + explicit Node( T const& _value ) : value( _value ) {} + virtual ~Node() {} + + using ChildNodes = std::vector<std::shared_ptr<ChildNodeT>>; + T value; + ChildNodes children; + }; + struct SectionNode { + explicit SectionNode(SectionStats const& _stats) : stats(_stats) {} + virtual ~SectionNode() = default; + + bool operator == (SectionNode const& other) const { + return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; + } + bool operator == (std::shared_ptr<SectionNode> const& other) const { + return operator==(*other); + } + + SectionStats stats; + using ChildSections = std::vector<std::shared_ptr<SectionNode>>; + using Assertions = std::vector<AssertionStats>; + ChildSections childSections; + Assertions assertions; + std::string stdOut; + std::string stdErr; + }; + + struct BySectionInfo { + BySectionInfo( SectionInfo const& other ) : m_other( other ) {} + BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} + bool operator() (std::shared_ptr<SectionNode> const& node) const { + return ((node->stats.sectionInfo.name == m_other.name) && + (node->stats.sectionInfo.lineInfo == m_other.lineInfo)); + } + void operator=(BySectionInfo const&) = delete; + + private: + SectionInfo const& m_other; + }; + + using TestCaseNode = Node<TestCaseStats, SectionNode>; + using TestGroupNode = Node<TestGroupStats, TestCaseNode>; + using TestRunNode = Node<TestRunStats, TestGroupNode>; + + CumulativeReporterBase( ReporterConfig const& _config ) + : m_config( _config.fullConfig() ), + stream( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = false; + if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) + CATCH_ERROR( "Verbosity level not supported by this reporter" ); + } + ~CumulativeReporterBase() override = default; + + ReporterPreferences getPreferences() const override { + return m_reporterPrefs; + } + + static std::set<Verbosity> getSupportedVerbosities() { + return { Verbosity::Normal }; + } + + void testRunStarting( TestRunInfo const& ) override {} + void testGroupStarting( GroupInfo const& ) override {} + + void testCaseStarting( TestCaseInfo const& ) override {} + + void sectionStarting( SectionInfo const& sectionInfo ) override { + SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); + std::shared_ptr<SectionNode> node; + if( m_sectionStack.empty() ) { + if( !m_rootSection ) + m_rootSection = std::make_shared<SectionNode>( incompleteStats ); + node = m_rootSection; + } + else { + SectionNode& parentNode = *m_sectionStack.back(); + auto it = + std::find_if( parentNode.childSections.begin(), + parentNode.childSections.end(), + BySectionInfo( sectionInfo ) ); + if( it == parentNode.childSections.end() ) { + node = std::make_shared<SectionNode>( incompleteStats ); + parentNode.childSections.push_back( node ); + } + else + node = *it; + } + m_sectionStack.push_back( node ); + m_deepestSection = std::move(node); + } + + void assertionStarting(AssertionInfo const&) override {} + + bool assertionEnded(AssertionStats const& assertionStats) override { + assert(!m_sectionStack.empty()); + // AssertionResult holds a pointer to a temporary DecomposedExpression, + // which getExpandedExpression() calls to build the expression string. + // Our section stack copy of the assertionResult will likely outlive the + // temporary, so it must be expanded or discarded now to avoid calling + // a destroyed object later. + prepareExpandedExpression(const_cast<AssertionResult&>( assertionStats.assertionResult ) ); + SectionNode& sectionNode = *m_sectionStack.back(); + sectionNode.assertions.push_back(assertionStats); + return true; + } + void sectionEnded(SectionStats const& sectionStats) override { + assert(!m_sectionStack.empty()); + SectionNode& node = *m_sectionStack.back(); + node.stats = sectionStats; + m_sectionStack.pop_back(); + } + void testCaseEnded(TestCaseStats const& testCaseStats) override { + auto node = std::make_shared<TestCaseNode>(testCaseStats); + assert(m_sectionStack.size() == 0); + node->children.push_back(m_rootSection); + m_testCases.push_back(node); + m_rootSection.reset(); + + assert(m_deepestSection); + m_deepestSection->stdOut = testCaseStats.stdOut; + m_deepestSection->stdErr = testCaseStats.stdErr; + } + void testGroupEnded(TestGroupStats const& testGroupStats) override { + auto node = std::make_shared<TestGroupNode>(testGroupStats); + node->children.swap(m_testCases); + m_testGroups.push_back(node); + } + void testRunEnded(TestRunStats const& testRunStats) override { + auto node = std::make_shared<TestRunNode>(testRunStats); + node->children.swap(m_testGroups); + m_testRuns.push_back(node); + testRunEndedCumulative(); + } + virtual void testRunEndedCumulative() = 0; + + void skipTest(TestCaseInfo const&) override {} + + IConfigPtr m_config; + std::ostream& stream; + std::vector<AssertionStats> m_assertions; + std::vector<std::vector<std::shared_ptr<SectionNode>>> m_sections; + std::vector<std::shared_ptr<TestCaseNode>> m_testCases; + std::vector<std::shared_ptr<TestGroupNode>> m_testGroups; + + std::vector<std::shared_ptr<TestRunNode>> m_testRuns; + + std::shared_ptr<SectionNode> m_rootSection; + std::shared_ptr<SectionNode> m_deepestSection; + std::vector<std::shared_ptr<SectionNode>> m_sectionStack; + ReporterPreferences m_reporterPrefs; + }; + + template<char C> + char const* getLineOfChars() { + static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; + if( !*line ) { + std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); + line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; + } + return line; + } + + struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> { + TestEventListenerBase( ReporterConfig const& _config ); + + static std::set<Verbosity> getSupportedVerbosities(); + + void assertionStarting(AssertionInfo const&) override; + bool assertionEnded(AssertionStats const&) override; + }; + +} // end namespace Catch + +// end catch_reporter_bases.hpp +// start catch_console_colour.h + +namespace Catch { + + struct Colour { + enum Code { + None = 0, + + White, + Red, + Green, + Blue, + Cyan, + Yellow, + Grey, + + Bright = 0x10, + + BrightRed = Bright | Red, + BrightGreen = Bright | Green, + LightGrey = Bright | Grey, + BrightWhite = Bright | White, + BrightYellow = Bright | Yellow, + + // By intention + FileName = LightGrey, + Warning = BrightYellow, + ResultError = BrightRed, + ResultSuccess = BrightGreen, + ResultExpectedFailure = Warning, + + Error = BrightRed, + Success = Green, + + OriginalExpression = Cyan, + ReconstructedExpression = BrightYellow, + + SecondaryText = LightGrey, + Headers = White + }; + + // Use constructed object for RAII guard + Colour( Code _colourCode ); + Colour( Colour&& other ) noexcept; + Colour& operator=( Colour&& other ) noexcept; + ~Colour(); + + // Use static method for one-shot changes + static void use( Code _colourCode ); + + private: + bool m_moved = false; + }; + + std::ostream& operator << ( std::ostream& os, Colour const& ); + +} // end namespace Catch + +// end catch_console_colour.h +// start catch_reporter_registrars.hpp + + +namespace Catch { + + template<typename T> + class ReporterRegistrar { + + class ReporterFactory : public IReporterFactory { + + IStreamingReporterPtr create( ReporterConfig const& config ) const override { + return std::unique_ptr<T>( new T( config ) ); + } + + std::string getDescription() const override { + return T::getDescription(); + } + }; + + public: + + explicit ReporterRegistrar( std::string const& name ) { + getMutableRegistryHub().registerReporter( name, std::make_shared<ReporterFactory>() ); + } + }; + + template<typename T> + class ListenerRegistrar { + + class ListenerFactory : public IReporterFactory { + + IStreamingReporterPtr create( ReporterConfig const& config ) const override { + return std::unique_ptr<T>( new T( config ) ); + } + std::string getDescription() const override { + return std::string(); + } + }; + + public: + + ListenerRegistrar() { + getMutableRegistryHub().registerListener( std::make_shared<ListenerFactory>() ); + } + }; +} + +#if !defined(CATCH_CONFIG_DISABLE) + +#define CATCH_REGISTER_REPORTER( name, reporterType ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + +#define CATCH_REGISTER_LISTENER( listenerType ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION +#else // CATCH_CONFIG_DISABLE + +#define CATCH_REGISTER_REPORTER(name, reporterType) +#define CATCH_REGISTER_LISTENER(listenerType) + +#endif // CATCH_CONFIG_DISABLE + +// end catch_reporter_registrars.hpp +// Allow users to base their work off existing reporters +// start catch_reporter_compact.h + +namespace Catch { + + struct CompactReporter : StreamingReporterBase<CompactReporter> { + + using StreamingReporterBase::StreamingReporterBase; + + ~CompactReporter() override; + + static std::string getDescription(); + + void noMatchingTestCases(std::string const& spec) override; + + void assertionStarting(AssertionInfo const&) override; + + bool assertionEnded(AssertionStats const& _assertionStats) override; + + void sectionEnded(SectionStats const& _sectionStats) override; + + void testRunEnded(TestRunStats const& _testRunStats) override; + + }; + +} // end namespace Catch + +// end catch_reporter_compact.h +// start catch_reporter_console.h + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch + // Note that 4062 (not all labels are handled + // and default is missing) is enabled +#endif + +namespace Catch { + // Fwd decls + struct SummaryColumn; + class TablePrinter; + + struct ConsoleReporter : StreamingReporterBase<ConsoleReporter> { + std::unique_ptr<TablePrinter> m_tablePrinter; + + ConsoleReporter(ReporterConfig const& config); + ~ConsoleReporter() override; + static std::string getDescription(); + + void noMatchingTestCases(std::string const& spec) override; + + void reportInvalidArguments(std::string const&arg) override; + + void assertionStarting(AssertionInfo const&) override; + + bool assertionEnded(AssertionStats const& _assertionStats) override; + + void sectionStarting(SectionInfo const& _sectionInfo) override; + void sectionEnded(SectionStats const& _sectionStats) override; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing(std::string const& name) override; + void benchmarkStarting(BenchmarkInfo const& info) override; + void benchmarkEnded(BenchmarkStats<> const& stats) override; + void benchmarkFailed(std::string const& error) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void testCaseEnded(TestCaseStats const& _testCaseStats) override; + void testGroupEnded(TestGroupStats const& _testGroupStats) override; + void testRunEnded(TestRunStats const& _testRunStats) override; + void testRunStarting(TestRunInfo const& _testRunInfo) override; + private: + + void lazyPrint(); + + void lazyPrintWithoutClosingBenchmarkTable(); + void lazyPrintRunInfo(); + void lazyPrintGroupInfo(); + void printTestCaseAndSectionHeader(); + + void printClosedHeader(std::string const& _name); + void printOpenHeader(std::string const& _name); + + // if string has a : in first line will set indent to follow it on + // subsequent lines + void printHeaderString(std::string const& _string, std::size_t indent = 0); + + void printTotals(Totals const& totals); + void printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row); + + void printTotalsDivider(Totals const& totals); + void printSummaryDivider(); + void printTestFilters(); + + private: + bool m_headerPrinted = false; + }; + +} // end namespace Catch + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +// end catch_reporter_console.h +// start catch_reporter_junit.h + +// start catch_xmlwriter.h + +#include <vector> + +namespace Catch { + enum class XmlFormatting { + None = 0x00, + Indent = 0x01, + Newline = 0x02, + }; + + XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs); + XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs); + + class XmlEncode { + public: + enum ForWhat { ForTextNodes, ForAttributes }; + + XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ); + + void encodeTo( std::ostream& os ) const; + + friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ); + + private: + std::string m_str; + ForWhat m_forWhat; + }; + + class XmlWriter { + public: + + class ScopedElement { + public: + ScopedElement( XmlWriter* writer, XmlFormatting fmt ); + + ScopedElement( ScopedElement&& other ) noexcept; + ScopedElement& operator=( ScopedElement&& other ) noexcept; + + ~ScopedElement(); + + ScopedElement& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent ); + + template<typename T> + ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { + m_writer->writeAttribute( name, attribute ); + return *this; + } + + private: + mutable XmlWriter* m_writer = nullptr; + XmlFormatting m_fmt; + }; + + XmlWriter( std::ostream& os = Catch::cout() ); + ~XmlWriter(); + + XmlWriter( XmlWriter const& ) = delete; + XmlWriter& operator=( XmlWriter const& ) = delete; + + XmlWriter& startElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + ScopedElement scopedElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + XmlWriter& endElement(XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ); + + XmlWriter& writeAttribute( std::string const& name, bool attribute ); + + template<typename T> + XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { + ReusableStringStream rss; + rss << attribute; + return writeAttribute( name, rss.str() ); + } + + XmlWriter& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + XmlWriter& writeComment(std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent); + + void writeStylesheetRef( std::string const& url ); + + XmlWriter& writeBlankLine(); + + void ensureTagClosed(); + + private: + + void applyFormatting(XmlFormatting fmt); + + void writeDeclaration(); + + void newlineIfNecessary(); + + bool m_tagIsOpen = false; + bool m_needsNewline = false; + std::vector<std::string> m_tags; + std::string m_indent; + std::ostream& m_os; + }; + +} + +// end catch_xmlwriter.h +namespace Catch { + + class JunitReporter : public CumulativeReporterBase<JunitReporter> { + public: + JunitReporter(ReporterConfig const& _config); + + ~JunitReporter() override; + + static std::string getDescription(); + + void noMatchingTestCases(std::string const& /*spec*/) override; + + void testRunStarting(TestRunInfo const& runInfo) override; + + void testGroupStarting(GroupInfo const& groupInfo) override; + + void testCaseStarting(TestCaseInfo const& testCaseInfo) override; + bool assertionEnded(AssertionStats const& assertionStats) override; + + void testCaseEnded(TestCaseStats const& testCaseStats) override; + + void testGroupEnded(TestGroupStats const& testGroupStats) override; + + void testRunEndedCumulative() override; + + void writeGroup(TestGroupNode const& groupNode, double suiteTime); + + void writeTestCase(TestCaseNode const& testCaseNode); + + void writeSection(std::string const& className, + std::string const& rootName, + SectionNode const& sectionNode); + + void writeAssertions(SectionNode const& sectionNode); + void writeAssertion(AssertionStats const& stats); + + XmlWriter xml; + Timer suiteTimer; + std::string stdOutForSuite; + std::string stdErrForSuite; + unsigned int unexpectedExceptions = 0; + bool m_okToFail = false; + }; + +} // end namespace Catch + +// end catch_reporter_junit.h +// start catch_reporter_xml.h + +namespace Catch { + class XmlReporter : public StreamingReporterBase<XmlReporter> { + public: + XmlReporter(ReporterConfig const& _config); + + ~XmlReporter() override; + + static std::string getDescription(); + + virtual std::string getStylesheetRef() const; + + void writeSourceInfo(SourceLineInfo const& sourceInfo); + + public: // StreamingReporterBase + + void noMatchingTestCases(std::string const& s) override; + + void testRunStarting(TestRunInfo const& testInfo) override; + + void testGroupStarting(GroupInfo const& groupInfo) override; + + void testCaseStarting(TestCaseInfo const& testInfo) override; + + void sectionStarting(SectionInfo const& sectionInfo) override; + + void assertionStarting(AssertionInfo const&) override; + + bool assertionEnded(AssertionStats const& assertionStats) override; + + void sectionEnded(SectionStats const& sectionStats) override; + + void testCaseEnded(TestCaseStats const& testCaseStats) override; + + void testGroupEnded(TestGroupStats const& testGroupStats) override; + + void testRunEnded(TestRunStats const& testRunStats) override; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing(std::string const& name) override; + void benchmarkStarting(BenchmarkInfo const&) override; + void benchmarkEnded(BenchmarkStats<> const&) override; + void benchmarkFailed(std::string const&) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + private: + Timer m_testCaseTimer; + XmlWriter m_xml; + int m_sectionDepth = 0; + }; + +} // end namespace Catch + +// end catch_reporter_xml.h + +// end catch_external_interfaces.h +#endif + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +// start catch_benchmarking_all.hpp + +// A proxy header that includes all of the benchmarking headers to allow +// concise include of the benchmarking features. You should prefer the +// individual includes in standard use. + +// start catch_benchmark.hpp + + // Benchmark + +// start catch_chronometer.hpp + +// User-facing chronometer + + +// start catch_clock.hpp + +// Clocks + + +#include <chrono> +#include <ratio> + +namespace Catch { + namespace Benchmark { + template <typename Clock> + using ClockDuration = typename Clock::duration; + template <typename Clock> + using FloatDuration = std::chrono::duration<double, typename Clock::period>; + + template <typename Clock> + using TimePoint = typename Clock::time_point; + + using default_clock = std::chrono::steady_clock; + + template <typename Clock> + struct now { + TimePoint<Clock> operator()() const { + return Clock::now(); + } + }; + + using fp_seconds = std::chrono::duration<double, std::ratio<1>>; + } // namespace Benchmark +} // namespace Catch + +// end catch_clock.hpp +// start catch_optimizer.hpp + + // Hinting the optimizer + + +#if defined(_MSC_VER) +# include <atomic> // atomic_thread_fence +#endif + +namespace Catch { + namespace Benchmark { +#if defined(__GNUC__) || defined(__clang__) + template <typename T> + inline void keep_memory(T* p) { + asm volatile("" : : "g"(p) : "memory"); + } + inline void keep_memory() { + asm volatile("" : : : "memory"); + } + + namespace Detail { + inline void optimizer_barrier() { keep_memory(); } + } // namespace Detail +#elif defined(_MSC_VER) + +#pragma optimize("", off) + template <typename T> + inline void keep_memory(T* p) { + // thanks @milleniumbug + *reinterpret_cast<char volatile*>(p) = *reinterpret_cast<char const volatile*>(p); + } + // TODO equivalent keep_memory() +#pragma optimize("", on) + + namespace Detail { + inline void optimizer_barrier() { + std::atomic_thread_fence(std::memory_order_seq_cst); + } + } // namespace Detail + +#endif + + template <typename T> + inline void deoptimize_value(T&& x) { + keep_memory(&x); + } + + template <typename Fn, typename... Args> + inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<!std::is_same<void, decltype(fn(args...))>::value>::type { + deoptimize_value(std::forward<Fn>(fn) (std::forward<Args...>(args...))); + } + + template <typename Fn, typename... Args> + inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename std::enable_if<std::is_same<void, decltype(fn(args...))>::value>::type { + std::forward<Fn>(fn) (std::forward<Args...>(args...)); + } + } // namespace Benchmark +} // namespace Catch + +// end catch_optimizer.hpp +// start catch_complete_invoke.hpp + +// Invoke with a special case for void + + +#include <type_traits> +#include <utility> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename T> + struct CompleteType { using type = T; }; + template <> + struct CompleteType<void> { struct type {}; }; + + template <typename T> + using CompleteType_t = typename CompleteType<T>::type; + + template <typename Result> + struct CompleteInvoker { + template <typename Fun, typename... Args> + static Result invoke(Fun&& fun, Args&&... args) { + return std::forward<Fun>(fun)(std::forward<Args>(args)...); + } + }; + template <> + struct CompleteInvoker<void> { + template <typename Fun, typename... Args> + static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) { + std::forward<Fun>(fun)(std::forward<Args>(args)...); + return {}; + } + }; + + // invoke and not return void :( + template <typename Fun, typename... Args> + CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(Fun&& fun, Args&&... args) { + return CompleteInvoker<FunctionReturnType<Fun, Args...>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...); + } + + const std::string benchmarkErrorMsg = "a benchmark failed to run successfully"; + } // namespace Detail + + template <typename Fun> + Detail::CompleteType_t<FunctionReturnType<Fun>> user_code(Fun&& fun) { + CATCH_TRY{ + return Detail::complete_invoke(std::forward<Fun>(fun)); + } CATCH_CATCH_ALL{ + getResultCapture().benchmarkFailed(translateActiveException()); + CATCH_RUNTIME_ERROR(Detail::benchmarkErrorMsg); + } + } + } // namespace Benchmark +} // namespace Catch + +// end catch_complete_invoke.hpp +namespace Catch { + namespace Benchmark { + namespace Detail { + struct ChronometerConcept { + virtual void start() = 0; + virtual void finish() = 0; + virtual ~ChronometerConcept() = default; + }; + template <typename Clock> + struct ChronometerModel final : public ChronometerConcept { + void start() override { started = Clock::now(); } + void finish() override { finished = Clock::now(); } + + ClockDuration<Clock> elapsed() const { return finished - started; } + + TimePoint<Clock> started; + TimePoint<Clock> finished; + }; + } // namespace Detail + + struct Chronometer { + public: + template <typename Fun> + void measure(Fun&& fun) { measure(std::forward<Fun>(fun), is_callable<Fun(int)>()); } + + int runs() const { return k; } + + Chronometer(Detail::ChronometerConcept& meter, int k) + : impl(&meter) + , k(k) {} + + private: + template <typename Fun> + void measure(Fun&& fun, std::false_type) { + measure([&fun](int) { return fun(); }, std::true_type()); + } + + template <typename Fun> + void measure(Fun&& fun, std::true_type) { + Detail::optimizer_barrier(); + impl->start(); + for (int i = 0; i < k; ++i) invoke_deoptimized(fun, i); + impl->finish(); + Detail::optimizer_barrier(); + } + + Detail::ChronometerConcept* impl; + int k; + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_chronometer.hpp +// start catch_environment.hpp + +// Environment information + + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct EnvironmentEstimate { + Duration mean; + OutlierClassification outliers; + + template <typename Duration2> + operator EnvironmentEstimate<Duration2>() const { + return { mean, outliers }; + } + }; + template <typename Clock> + struct Environment { + using clock_type = Clock; + EnvironmentEstimate<FloatDuration<Clock>> clock_resolution; + EnvironmentEstimate<FloatDuration<Clock>> clock_cost; + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_environment.hpp +// start catch_execution_plan.hpp + + // Execution plan + + +// start catch_benchmark_function.hpp + + // Dumb std::function implementation for consistent call overhead + + +#include <cassert> +#include <type_traits> +#include <utility> +#include <memory> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename T> + using Decay = typename std::decay<T>::type; + template <typename T, typename U> + struct is_related + : std::is_same<Decay<T>, Decay<U>> {}; + + /// We need to reinvent std::function because every piece of code that might add overhead + /// in a measurement context needs to have consistent performance characteristics so that we + /// can account for it in the measurement. + /// Implementations of std::function with optimizations that aren't always applicable, like + /// small buffer optimizations, are not uncommon. + /// This is effectively an implementation of std::function without any such optimizations; + /// it may be slow, but it is consistently slow. + struct BenchmarkFunction { + private: + struct callable { + virtual void call(Chronometer meter) const = 0; + virtual callable* clone() const = 0; + virtual ~callable() = default; + }; + template <typename Fun> + struct model : public callable { + model(Fun&& fun) : fun(std::move(fun)) {} + model(Fun const& fun) : fun(fun) {} + + model<Fun>* clone() const override { return new model<Fun>(*this); } + + void call(Chronometer meter) const override { + call(meter, is_callable<Fun(Chronometer)>()); + } + void call(Chronometer meter, std::true_type) const { + fun(meter); + } + void call(Chronometer meter, std::false_type) const { + meter.measure(fun); + } + + Fun fun; + }; + + struct do_nothing { void operator()() const {} }; + + template <typename T> + BenchmarkFunction(model<T>* c) : f(c) {} + + public: + BenchmarkFunction() + : f(new model<do_nothing>{ {} }) {} + + template <typename Fun, + typename std::enable_if<!is_related<Fun, BenchmarkFunction>::value, int>::type = 0> + BenchmarkFunction(Fun&& fun) + : f(new model<typename std::decay<Fun>::type>(std::forward<Fun>(fun))) {} + + BenchmarkFunction(BenchmarkFunction&& that) + : f(std::move(that.f)) {} + + BenchmarkFunction(BenchmarkFunction const& that) + : f(that.f->clone()) {} + + BenchmarkFunction& operator=(BenchmarkFunction&& that) { + f = std::move(that.f); + return *this; + } + + BenchmarkFunction& operator=(BenchmarkFunction const& that) { + f.reset(that.f->clone()); + return *this; + } + + void operator()(Chronometer meter) const { f->call(meter); } + + private: + std::unique_ptr<callable> f; + }; + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_benchmark_function.hpp +// start catch_repeat.hpp + +// repeat algorithm + + +#include <type_traits> +#include <utility> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Fun> + struct repeater { + void operator()(int k) const { + for (int i = 0; i < k; ++i) { + fun(); + } + } + Fun fun; + }; + template <typename Fun> + repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) { + return { std::forward<Fun>(fun) }; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_repeat.hpp +// start catch_run_for_at_least.hpp + +// Run a function for a minimum amount of time + + +// start catch_measure.hpp + +// Measure + + +// start catch_timing.hpp + +// Timing + + +#include <tuple> +#include <type_traits> + +namespace Catch { + namespace Benchmark { + template <typename Duration, typename Result> + struct Timing { + Duration elapsed; + Result result; + int iterations; + }; + template <typename Clock, typename Func, typename... Args> + using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<FunctionReturnType<Func, Args...>>>; + } // namespace Benchmark +} // namespace Catch + +// end catch_timing.hpp +#include <utility> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Clock, typename Fun, typename... Args> + TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) { + auto start = Clock::now(); + auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...); + auto end = Clock::now(); + auto delta = end - start; + return { delta, std::forward<decltype(r)>(r), 1 }; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_measure.hpp +#include <utility> +#include <type_traits> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Clock, typename Fun> + TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::false_type) { + return Detail::measure<Clock>(fun, iters); + } + template <typename Clock, typename Fun> + TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters, std::true_type) { + Detail::ChronometerModel<Clock> meter; + auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters)); + + return { meter.elapsed(), std::move(result), iters }; + } + + template <typename Clock, typename Fun> + using run_for_at_least_argument_t = typename std::conditional<is_callable<Fun(Chronometer)>::value, Chronometer, int>::type; + + struct optimized_away_error : std::exception { + const char* what() const noexcept override { + return "could not measure benchmark, maybe it was optimized away"; + } + }; + + template <typename Clock, typename Fun> + TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) { + auto iters = seed; + while (iters < (1 << 30)) { + auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>()); + + if (Timing.elapsed >= how_long) { + return { Timing.elapsed, std::move(Timing.result), iters }; + } + iters *= 2; + } + throw optimized_away_error{}; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_run_for_at_least.hpp +#include <algorithm> + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct ExecutionPlan { + int iterations_per_sample; + Duration estimated_duration; + Detail::BenchmarkFunction benchmark; + Duration warmup_time; + int warmup_iterations; + + template <typename Duration2> + operator ExecutionPlan<Duration2>() const { + return { iterations_per_sample, estimated_duration, benchmark, warmup_time, warmup_iterations }; + } + + template <typename Clock> + std::vector<FloatDuration<Clock>> run(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const { + // warmup a bit + Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_iterations, Detail::repeat(now<Clock>{})); + + std::vector<FloatDuration<Clock>> times; + times.reserve(cfg.benchmarkSamples()); + std::generate_n(std::back_inserter(times), cfg.benchmarkSamples(), [this, env] { + Detail::ChronometerModel<Clock> model; + this->benchmark(Chronometer(model, iterations_per_sample)); + auto sample_time = model.elapsed() - env.clock_cost.mean; + if (sample_time < FloatDuration<Clock>::zero()) sample_time = FloatDuration<Clock>::zero(); + return sample_time / iterations_per_sample; + }); + return times; + } + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_execution_plan.hpp +// start catch_estimate_clock.hpp + + // Environment measurement + + +// start catch_stats.hpp + +// Statistical analysis tools + + +#include <algorithm> +#include <functional> +#include <vector> +#include <iterator> +#include <numeric> +#include <tuple> +#include <cmath> +#include <utility> +#include <cstddef> +#include <random> + +namespace Catch { + namespace Benchmark { + namespace Detail { + using sample = std::vector<double>; + + double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last); + + template <typename Iterator> + OutlierClassification classify_outliers(Iterator first, Iterator last) { + std::vector<double> copy(first, last); + + auto q1 = weighted_average_quantile(1, 4, copy.begin(), copy.end()); + auto q3 = weighted_average_quantile(3, 4, copy.begin(), copy.end()); + auto iqr = q3 - q1; + auto los = q1 - (iqr * 3.); + auto lom = q1 - (iqr * 1.5); + auto him = q3 + (iqr * 1.5); + auto his = q3 + (iqr * 3.); + + OutlierClassification o; + for (; first != last; ++first) { + auto&& t = *first; + if (t < los) ++o.low_severe; + else if (t < lom) ++o.low_mild; + else if (t > his) ++o.high_severe; + else if (t > him) ++o.high_mild; + ++o.samples_seen; + } + return o; + } + + template <typename Iterator> + double mean(Iterator first, Iterator last) { + auto count = last - first; + double sum = std::accumulate(first, last, 0.); + return sum / count; + } + + template <typename URng, typename Iterator, typename Estimator> + sample resample(URng& rng, int resamples, Iterator first, Iterator last, Estimator& estimator) { + auto n = last - first; + std::uniform_int_distribution<decltype(n)> dist(0, n - 1); + + sample out; + out.reserve(resamples); + std::generate_n(std::back_inserter(out), resamples, [n, first, &estimator, &dist, &rng] { + std::vector<double> resampled; + resampled.reserve(n); + std::generate_n(std::back_inserter(resampled), n, [first, &dist, &rng] { return first[dist(rng)]; }); + return estimator(resampled.begin(), resampled.end()); + }); + std::sort(out.begin(), out.end()); + return out; + } + + template <typename Estimator, typename Iterator> + sample jackknife(Estimator&& estimator, Iterator first, Iterator last) { + auto n = last - first; + auto second = std::next(first); + sample results; + results.reserve(n); + + for (auto it = first; it != last; ++it) { + std::iter_swap(it, first); + results.push_back(estimator(second, last)); + } + + return results; + } + + inline double normal_cdf(double x) { + return std::erfc(-x / std::sqrt(2.0)) / 2.0; + } + + double erfc_inv(double x); + + double normal_quantile(double p); + + template <typename Iterator, typename Estimator> + Estimate<double> bootstrap(double confidence_level, Iterator first, Iterator last, sample const& resample, Estimator&& estimator) { + auto n_samples = last - first; + + double point = estimator(first, last); + // Degenerate case with a single sample + if (n_samples == 1) return { point, point, point, confidence_level }; + + sample jack = jackknife(estimator, first, last); + double jack_mean = mean(jack.begin(), jack.end()); + double sum_squares, sum_cubes; + std::tie(sum_squares, sum_cubes) = std::accumulate(jack.begin(), jack.end(), std::make_pair(0., 0.), [jack_mean](std::pair<double, double> sqcb, double x) -> std::pair<double, double> { + auto d = jack_mean - x; + auto d2 = d * d; + auto d3 = d2 * d; + return { sqcb.first + d2, sqcb.second + d3 }; + }); + + double accel = sum_cubes / (6 * std::pow(sum_squares, 1.5)); + int n = static_cast<int>(resample.size()); + double prob_n = std::count_if(resample.begin(), resample.end(), [point](double x) { return x < point; }) / (double)n; + // degenerate case with uniform samples + if (prob_n == 0) return { point, point, point, confidence_level }; + + double bias = normal_quantile(prob_n); + double z1 = normal_quantile((1. - confidence_level) / 2.); + + auto cumn = [n](double x) -> int { + return std::lround(normal_cdf(x) * n); }; + auto a = [bias, accel](double b) { return bias + b / (1. - accel * b); }; + double b1 = bias + z1; + double b2 = bias - z1; + double a1 = a(b1); + double a2 = a(b2); + auto lo = std::max(cumn(a1), 0); + auto hi = std::min(cumn(a2), n - 1); + + return { point, resample[lo], resample[hi], confidence_level }; + } + + double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n); + + struct bootstrap_analysis { + Estimate<double> mean; + Estimate<double> standard_deviation; + double outlier_variance; + }; + + bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last); + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_stats.hpp +#include <algorithm> +#include <iterator> +#include <tuple> +#include <vector> +#include <cmath> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Clock> + std::vector<double> resolution(int k) { + std::vector<TimePoint<Clock>> times; + times.reserve(k + 1); + std::generate_n(std::back_inserter(times), k + 1, now<Clock>{}); + + std::vector<double> deltas; + deltas.reserve(k); + std::transform(std::next(times.begin()), times.end(), times.begin(), + std::back_inserter(deltas), + [](TimePoint<Clock> a, TimePoint<Clock> b) { return static_cast<double>((a - b).count()); }); + + return deltas; + } + + const auto warmup_iterations = 10000; + const auto warmup_time = std::chrono::milliseconds(100); + const auto minimum_ticks = 1000; + const auto warmup_seed = 10000; + const auto clock_resolution_estimation_time = std::chrono::milliseconds(500); + const auto clock_cost_estimation_time_limit = std::chrono::seconds(1); + const auto clock_cost_estimation_tick_limit = 100000; + const auto clock_cost_estimation_time = std::chrono::milliseconds(10); + const auto clock_cost_estimation_iterations = 10000; + + template <typename Clock> + int warmup() { + return run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(warmup_time), warmup_seed, &resolution<Clock>) + .iterations; + } + template <typename Clock> + EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolution(int iterations) { + auto r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_resolution_estimation_time), iterations, &resolution<Clock>) + .result; + return { + FloatDuration<Clock>(mean(r.begin(), r.end())), + classify_outliers(r.begin(), r.end()), + }; + } + template <typename Clock> + EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_cost(FloatDuration<Clock> resolution) { + auto time_limit = std::min(resolution * clock_cost_estimation_tick_limit, FloatDuration<Clock>(clock_cost_estimation_time_limit)); + auto time_clock = [](int k) { + return Detail::measure<Clock>([k] { + for (int i = 0; i < k; ++i) { + volatile auto ignored = Clock::now(); + (void)ignored; + } + }).elapsed; + }; + time_clock(1); + int iters = clock_cost_estimation_iterations; + auto&& r = run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(clock_cost_estimation_time), iters, time_clock); + std::vector<double> times; + int nsamples = static_cast<int>(std::ceil(time_limit / r.elapsed)); + times.reserve(nsamples); + std::generate_n(std::back_inserter(times), nsamples, [time_clock, &r] { + return static_cast<double>((time_clock(r.iterations) / r.iterations).count()); + }); + return { + FloatDuration<Clock>(mean(times.begin(), times.end())), + classify_outliers(times.begin(), times.end()), + }; + } + + template <typename Clock> + Environment<FloatDuration<Clock>> measure_environment() { + static Environment<FloatDuration<Clock>>* env = nullptr; + if (env) { + return *env; + } + + auto iters = Detail::warmup<Clock>(); + auto resolution = Detail::estimate_clock_resolution<Clock>(iters); + auto cost = Detail::estimate_clock_cost<Clock>(resolution.mean); + + env = new Environment<FloatDuration<Clock>>{ resolution, cost }; + return *env; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_estimate_clock.hpp +// start catch_analyse.hpp + + // Run and analyse one benchmark + + +// start catch_sample_analysis.hpp + +// Benchmark results + + +#include <algorithm> +#include <vector> +#include <string> +#include <iterator> + +namespace Catch { + namespace Benchmark { + template <typename Duration> + struct SampleAnalysis { + std::vector<Duration> samples; + Estimate<Duration> mean; + Estimate<Duration> standard_deviation; + OutlierClassification outliers; + double outlier_variance; + + template <typename Duration2> + operator SampleAnalysis<Duration2>() const { + std::vector<Duration2> samples2; + samples2.reserve(samples.size()); + std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](Duration d) { return Duration2(d); }); + return { + std::move(samples2), + mean, + standard_deviation, + outliers, + outlier_variance, + }; + } + }; + } // namespace Benchmark +} // namespace Catch + +// end catch_sample_analysis.hpp +#include <algorithm> +#include <iterator> +#include <vector> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename Duration, typename Iterator> + SampleAnalysis<Duration> analyse(const IConfig &cfg, Environment<Duration>, Iterator first, Iterator last) { + if (!cfg.benchmarkNoAnalysis()) { + std::vector<double> samples; + samples.reserve(last - first); + std::transform(first, last, std::back_inserter(samples), [](Duration d) { return d.count(); }); + + auto analysis = Catch::Benchmark::Detail::analyse_samples(cfg.benchmarkConfidenceInterval(), cfg.benchmarkResamples(), samples.begin(), samples.end()); + auto outliers = Catch::Benchmark::Detail::classify_outliers(samples.begin(), samples.end()); + + auto wrap_estimate = [](Estimate<double> e) { + return Estimate<Duration> { + Duration(e.point), + Duration(e.lower_bound), + Duration(e.upper_bound), + e.confidence_interval, + }; + }; + std::vector<Duration> samples2; + samples2.reserve(samples.size()); + std::transform(samples.begin(), samples.end(), std::back_inserter(samples2), [](double d) { return Duration(d); }); + return { + std::move(samples2), + wrap_estimate(analysis.mean), + wrap_estimate(analysis.standard_deviation), + outliers, + analysis.outlier_variance, + }; + } else { + std::vector<Duration> samples; + samples.reserve(last - first); + + Duration mean = Duration(0); + int i = 0; + for (auto it = first; it < last; ++it, ++i) { + samples.push_back(Duration(*it)); + mean += Duration(*it); + } + mean /= i; + + return { + std::move(samples), + Estimate<Duration>{mean, mean, mean, 0.0}, + Estimate<Duration>{Duration(0), Duration(0), Duration(0), 0.0}, + OutlierClassification{}, + 0.0 + }; + } + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +// end catch_analyse.hpp +#include <algorithm> +#include <functional> +#include <string> +#include <vector> +#include <cmath> + +namespace Catch { + namespace Benchmark { + struct Benchmark { + Benchmark(std::string &&name) + : name(std::move(name)) {} + + template <class FUN> + Benchmark(std::string &&name, FUN &&func) + : fun(std::move(func)), name(std::move(name)) {} + + template <typename Clock> + ExecutionPlan<FloatDuration<Clock>> prepare(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const { + auto min_time = env.clock_resolution.mean * Detail::minimum_ticks; + auto run_time = std::max(min_time, std::chrono::duration_cast<decltype(min_time)>(cfg.benchmarkWarmupTime())); + auto&& test = Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun); + int new_iters = static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed)); + return { new_iters, test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(), fun, std::chrono::duration_cast<FloatDuration<Clock>>(cfg.benchmarkWarmupTime()), Detail::warmup_iterations }; + } + + template <typename Clock = default_clock> + void run() { + IConfigPtr cfg = getCurrentContext().getConfig(); + + auto env = Detail::measure_environment<Clock>(); + + getResultCapture().benchmarkPreparing(name); + CATCH_TRY{ + auto plan = user_code([&] { + return prepare<Clock>(*cfg, env); + }); + + BenchmarkInfo info { + name, + plan.estimated_duration.count(), + plan.iterations_per_sample, + cfg->benchmarkSamples(), + cfg->benchmarkResamples(), + env.clock_resolution.mean.count(), + env.clock_cost.mean.count() + }; + + getResultCapture().benchmarkStarting(info); + + auto samples = user_code([&] { + return plan.template run<Clock>(*cfg, env); + }); + + auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end()); + BenchmarkStats<FloatDuration<Clock>> stats{ info, analysis.samples, analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance }; + getResultCapture().benchmarkEnded(stats); + + } CATCH_CATCH_ALL{ + if (translateActiveException() != Detail::benchmarkErrorMsg) // benchmark errors have been reported, otherwise rethrow. + std::rethrow_exception(std::current_exception()); + } + } + + // sets lambda to be used in fun *and* executes benchmark! + template <typename Fun, + typename std::enable_if<!Detail::is_related<Fun, Benchmark>::value, int>::type = 0> + Benchmark & operator=(Fun func) { + fun = Detail::BenchmarkFunction(func); + run(); + return *this; + } + + explicit operator bool() { + return true; + } + + private: + Detail::BenchmarkFunction fun; + std::string name; + }; + } +} // namespace Catch + +#define INTERNAL_CATCH_GET_1_ARG(arg1, arg2, ...) arg1 +#define INTERNAL_CATCH_GET_2_ARG(arg1, arg2, ...) arg2 + +#define INTERNAL_CATCH_BENCHMARK(BenchmarkName, name, benchmarkIndex)\ + if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \ + BenchmarkName = [&](int benchmarkIndex) + +#define INTERNAL_CATCH_BENCHMARK_ADVANCED(BenchmarkName, name)\ + if( Catch::Benchmark::Benchmark BenchmarkName{name} ) \ + BenchmarkName = [&] + +// end catch_benchmark.hpp +// start catch_constructor.hpp + +// Constructor and destructor helpers + + +#include <type_traits> + +namespace Catch { + namespace Benchmark { + namespace Detail { + template <typename T, bool Destruct> + struct ObjectStorage + { + using TStorage = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type; + + ObjectStorage() : data() {} + + ObjectStorage(const ObjectStorage& other) + { + new(&data) T(other.stored_object()); + } + + ObjectStorage(ObjectStorage&& other) + { + new(&data) T(std::move(other.stored_object())); + } + + ~ObjectStorage() { destruct_on_exit<T>(); } + + template <typename... Args> + void construct(Args&&... args) + { + new (&data) T(std::forward<Args>(args)...); + } + + template <bool AllowManualDestruction = !Destruct> + typename std::enable_if<AllowManualDestruction>::type destruct() + { + stored_object().~T(); + } + + private: + // If this is a constructor benchmark, destruct the underlying object + template <typename U> + void destruct_on_exit(typename std::enable_if<Destruct, U>::type* = 0) { destruct<true>(); } + // Otherwise, don't + template <typename U> + void destruct_on_exit(typename std::enable_if<!Destruct, U>::type* = 0) { } + + T& stored_object() { + return *static_cast<T*>(static_cast<void*>(&data)); + } + + T const& stored_object() const { + return *static_cast<T*>(static_cast<void*>(&data)); + } + + TStorage data; + }; + } + + template <typename T> + using storage_for = Detail::ObjectStorage<T, true>; + + template <typename T> + using destructable_object = Detail::ObjectStorage<T, false>; + } +} + +// end catch_constructor.hpp +// end catch_benchmarking_all.hpp +#endif + +#endif // ! CATCH_CONFIG_IMPL_ONLY + +#ifdef CATCH_IMPL +// start catch_impl.hpp + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wweak-vtables" +#endif + +// Keep these here for external reporters +// start catch_test_case_tracker.h + +#include <string> +#include <vector> +#include <memory> + +namespace Catch { +namespace TestCaseTracking { + + struct NameAndLocation { + std::string name; + SourceLineInfo location; + + NameAndLocation( std::string const& _name, SourceLineInfo const& _location ); + friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) { + return lhs.name == rhs.name + && lhs.location == rhs.location; + } + }; + + class ITracker; + + using ITrackerPtr = std::shared_ptr<ITracker>; + + class ITracker { + NameAndLocation m_nameAndLocation; + + public: + ITracker(NameAndLocation const& nameAndLoc) : + m_nameAndLocation(nameAndLoc) + {} + + // static queries + NameAndLocation const& nameAndLocation() const { + return m_nameAndLocation; + } + + virtual ~ITracker(); + + // dynamic queries + virtual bool isComplete() const = 0; // Successfully completed or failed + virtual bool isSuccessfullyCompleted() const = 0; + virtual bool isOpen() const = 0; // Started but not complete + virtual bool hasChildren() const = 0; + virtual bool hasStarted() const = 0; + + virtual ITracker& parent() = 0; + + // actions + virtual void close() = 0; // Successfully complete + virtual void fail() = 0; + virtual void markAsNeedingAnotherRun() = 0; + + virtual void addChild( ITrackerPtr const& child ) = 0; + virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0; + virtual void openChild() = 0; + + // Debug/ checking + virtual bool isSectionTracker() const = 0; + virtual bool isGeneratorTracker() const = 0; + }; + + class TrackerContext { + + enum RunState { + NotStarted, + Executing, + CompletedCycle + }; + + ITrackerPtr m_rootTracker; + ITracker* m_currentTracker = nullptr; + RunState m_runState = NotStarted; + + public: + + ITracker& startRun(); + void endRun(); + + void startCycle(); + void completeCycle(); + + bool completedCycle() const; + ITracker& currentTracker(); + void setCurrentTracker( ITracker* tracker ); + }; + + class TrackerBase : public ITracker { + protected: + enum CycleState { + NotStarted, + Executing, + ExecutingChildren, + NeedsAnotherRun, + CompletedSuccessfully, + Failed + }; + + using Children = std::vector<ITrackerPtr>; + TrackerContext& m_ctx; + ITracker* m_parent; + Children m_children; + CycleState m_runState = NotStarted; + + public: + TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); + + bool isComplete() const override; + bool isSuccessfullyCompleted() const override; + bool isOpen() const override; + bool hasChildren() const override; + bool hasStarted() const override { + return m_runState != NotStarted; + } + + void addChild( ITrackerPtr const& child ) override; + + ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) override; + ITracker& parent() override; + + void openChild() override; + + bool isSectionTracker() const override; + bool isGeneratorTracker() const override; + + void open(); + + void close() override; + void fail() override; + void markAsNeedingAnotherRun() override; + + private: + void moveToParent(); + void moveToThis(); + }; + + class SectionTracker : public TrackerBase { + std::vector<std::string> m_filters; + std::string m_trimmed_name; + public: + SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); + + bool isSectionTracker() const override; + + bool isComplete() const override; + + static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ); + + void tryOpen(); + + void addInitialFilters( std::vector<std::string> const& filters ); + void addNextFilters( std::vector<std::string> const& filters ); + //! Returns filters active in this tracker + std::vector<std::string> const& getFilters() const; + //! Returns whitespace-trimmed name of the tracked section + std::string const& trimmedName() const; + }; + +} // namespace TestCaseTracking + +using TestCaseTracking::ITracker; +using TestCaseTracking::TrackerContext; +using TestCaseTracking::SectionTracker; + +} // namespace Catch + +// end catch_test_case_tracker.h + +// start catch_leak_detector.h + +namespace Catch { + + struct LeakDetector { + LeakDetector(); + ~LeakDetector(); + }; + +} +// end catch_leak_detector.h +// Cpp files will be included in the single-header file here +// start catch_stats.cpp + +// Statistical analysis tools + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + +#include <cassert> +#include <random> + +#if defined(CATCH_CONFIG_USE_ASYNC) +#include <future> +#endif + +namespace { + double erf_inv(double x) { + // Code accompanying the article "Approximating the erfinv function" in GPU Computing Gems, Volume 2 + double w, p; + + w = -log((1.0 - x) * (1.0 + x)); + + if (w < 6.250000) { + w = w - 3.125000; + p = -3.6444120640178196996e-21; + p = -1.685059138182016589e-19 + p * w; + p = 1.2858480715256400167e-18 + p * w; + p = 1.115787767802518096e-17 + p * w; + p = -1.333171662854620906e-16 + p * w; + p = 2.0972767875968561637e-17 + p * w; + p = 6.6376381343583238325e-15 + p * w; + p = -4.0545662729752068639e-14 + p * w; + p = -8.1519341976054721522e-14 + p * w; + p = 2.6335093153082322977e-12 + p * w; + p = -1.2975133253453532498e-11 + p * w; + p = -5.4154120542946279317e-11 + p * w; + p = 1.051212273321532285e-09 + p * w; + p = -4.1126339803469836976e-09 + p * w; + p = -2.9070369957882005086e-08 + p * w; + p = 4.2347877827932403518e-07 + p * w; + p = -1.3654692000834678645e-06 + p * w; + p = -1.3882523362786468719e-05 + p * w; + p = 0.0001867342080340571352 + p * w; + p = -0.00074070253416626697512 + p * w; + p = -0.0060336708714301490533 + p * w; + p = 0.24015818242558961693 + p * w; + p = 1.6536545626831027356 + p * w; + } else if (w < 16.000000) { + w = sqrt(w) - 3.250000; + p = 2.2137376921775787049e-09; + p = 9.0756561938885390979e-08 + p * w; + p = -2.7517406297064545428e-07 + p * w; + p = 1.8239629214389227755e-08 + p * w; + p = 1.5027403968909827627e-06 + p * w; + p = -4.013867526981545969e-06 + p * w; + p = 2.9234449089955446044e-06 + p * w; + p = 1.2475304481671778723e-05 + p * w; + p = -4.7318229009055733981e-05 + p * w; + p = 6.8284851459573175448e-05 + p * w; + p = 2.4031110387097893999e-05 + p * w; + p = -0.0003550375203628474796 + p * w; + p = 0.00095328937973738049703 + p * w; + p = -0.0016882755560235047313 + p * w; + p = 0.0024914420961078508066 + p * w; + p = -0.0037512085075692412107 + p * w; + p = 0.005370914553590063617 + p * w; + p = 1.0052589676941592334 + p * w; + p = 3.0838856104922207635 + p * w; + } else { + w = sqrt(w) - 5.000000; + p = -2.7109920616438573243e-11; + p = -2.5556418169965252055e-10 + p * w; + p = 1.5076572693500548083e-09 + p * w; + p = -3.7894654401267369937e-09 + p * w; + p = 7.6157012080783393804e-09 + p * w; + p = -1.4960026627149240478e-08 + p * w; + p = 2.9147953450901080826e-08 + p * w; + p = -6.7711997758452339498e-08 + p * w; + p = 2.2900482228026654717e-07 + p * w; + p = -9.9298272942317002539e-07 + p * w; + p = 4.5260625972231537039e-06 + p * w; + p = -1.9681778105531670567e-05 + p * w; + p = 7.5995277030017761139e-05 + p * w; + p = -0.00021503011930044477347 + p * w; + p = -0.00013871931833623122026 + p * w; + p = 1.0103004648645343977 + p * w; + p = 4.8499064014085844221 + p * w; + } + return p * x; + } + + double standard_deviation(std::vector<double>::iterator first, std::vector<double>::iterator last) { + auto m = Catch::Benchmark::Detail::mean(first, last); + double variance = std::accumulate(first, last, 0., [m](double a, double b) { + double diff = b - m; + return a + diff * diff; + }) / (last - first); + return std::sqrt(variance); + } + +} + +namespace Catch { + namespace Benchmark { + namespace Detail { + + double weighted_average_quantile(int k, int q, std::vector<double>::iterator first, std::vector<double>::iterator last) { + auto count = last - first; + double idx = (count - 1) * k / static_cast<double>(q); + int j = static_cast<int>(idx); + double g = idx - j; + std::nth_element(first, first + j, last); + auto xj = first[j]; + if (g == 0) return xj; + + auto xj1 = *std::min_element(first + (j + 1), last); + return xj + g * (xj1 - xj); + } + + double erfc_inv(double x) { + return erf_inv(1.0 - x); + } + + double normal_quantile(double p) { + static const double ROOT_TWO = std::sqrt(2.0); + + double result = 0.0; + assert(p >= 0 && p <= 1); + if (p < 0 || p > 1) { + return result; + } + + result = -erfc_inv(2.0 * p); + // result *= normal distribution standard deviation (1.0) * sqrt(2) + result *= /*sd * */ ROOT_TWO; + // result += normal disttribution mean (0) + return result; + } + + double outlier_variance(Estimate<double> mean, Estimate<double> stddev, int n) { + double sb = stddev.point; + double mn = mean.point / n; + double mg_min = mn / 2.; + double sg = std::min(mg_min / 4., sb / std::sqrt(n)); + double sg2 = sg * sg; + double sb2 = sb * sb; + + auto c_max = [n, mn, sb2, sg2](double x) -> double { + double k = mn - x; + double d = k * k; + double nd = n * d; + double k0 = -n * nd; + double k1 = sb2 - n * sg2 + nd; + double det = k1 * k1 - 4 * sg2 * k0; + return (int)(-2. * k0 / (k1 + std::sqrt(det))); + }; + + auto var_out = [n, sb2, sg2](double c) { + double nc = n - c; + return (nc / n) * (sb2 - nc * sg2); + }; + + return std::min(var_out(1), var_out(std::min(c_max(0.), c_max(mg_min)))) / sb2; + } + + bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last) { + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS + static std::random_device entropy; + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + + auto n = static_cast<int>(last - first); // seriously, one can't use integral types without hell in C++ + + auto mean = &Detail::mean<std::vector<double>::iterator>; + auto stddev = &standard_deviation; + +#if defined(CATCH_CONFIG_USE_ASYNC) + auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) { + auto seed = entropy(); + return std::async(std::launch::async, [=] { + std::mt19937 rng(seed); + auto resampled = resample(rng, n_resamples, first, last, f); + return bootstrap(confidence_level, first, last, resampled, f); + }); + }; + + auto mean_future = Estimate(mean); + auto stddev_future = Estimate(stddev); + + auto mean_estimate = mean_future.get(); + auto stddev_estimate = stddev_future.get(); +#else + auto Estimate = [=](double(*f)(std::vector<double>::iterator, std::vector<double>::iterator)) { + auto seed = entropy(); + std::mt19937 rng(seed); + auto resampled = resample(rng, n_resamples, first, last, f); + return bootstrap(confidence_level, first, last, resampled, f); + }; + + auto mean_estimate = Estimate(mean); + auto stddev_estimate = Estimate(stddev); +#endif // CATCH_USE_ASYNC + + double outlier_variance = Detail::outlier_variance(mean_estimate, stddev_estimate, n); + + return { mean_estimate, stddev_estimate, outlier_variance }; + } + } // namespace Detail + } // namespace Benchmark +} // namespace Catch + +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING +// end catch_stats.cpp +// start catch_approx.cpp + +#include <cmath> +#include <limits> + +namespace { + +// Performs equivalent check of std::fabs(lhs - rhs) <= margin +// But without the subtraction to allow for INFINITY in comparison +bool marginComparison(double lhs, double rhs, double margin) { + return (lhs + margin >= rhs) && (rhs + margin >= lhs); +} + +} + +namespace Catch { +namespace Detail { + + Approx::Approx ( double value ) + : m_epsilon( std::numeric_limits<float>::epsilon()*100 ), + m_margin( 0.0 ), + m_scale( 0.0 ), + m_value( value ) + {} + + Approx Approx::custom() { + return Approx( 0 ); + } + + Approx Approx::operator-() const { + auto temp(*this); + temp.m_value = -temp.m_value; + return temp; + } + + std::string Approx::toString() const { + ReusableStringStream rss; + rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )"; + return rss.str(); + } + + bool Approx::equalityComparisonImpl(const double other) const { + // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value + // Thanks to Richard Harris for his help refining the scaled margin value + return marginComparison(m_value, other, m_margin) + || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(std::isinf(m_value)? 0 : m_value))); + } + + void Approx::setMargin(double newMargin) { + CATCH_ENFORCE(newMargin >= 0, + "Invalid Approx::margin: " << newMargin << '.' + << " Approx::Margin has to be non-negative."); + m_margin = newMargin; + } + + void Approx::setEpsilon(double newEpsilon) { + CATCH_ENFORCE(newEpsilon >= 0 && newEpsilon <= 1.0, + "Invalid Approx::epsilon: " << newEpsilon << '.' + << " Approx::epsilon has to be in [0, 1]"); + m_epsilon = newEpsilon; + } + +} // end namespace Detail + +namespace literals { + Detail::Approx operator "" _a(long double val) { + return Detail::Approx(val); + } + Detail::Approx operator "" _a(unsigned long long val) { + return Detail::Approx(val); + } +} // end namespace literals + +std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) { + return value.toString(); +} + +} // end namespace Catch +// end catch_approx.cpp +// start catch_assertionhandler.cpp + +// start catch_debugger.h + +namespace Catch { + bool isDebuggerActive(); +} + +#ifdef CATCH_PLATFORM_MAC + + #if defined(__i386__) || defined(__x86_64__) + #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ + #elif defined(__aarch64__) + #define CATCH_TRAP() __asm__(".inst 0xd4200000") + #endif + +#elif defined(CATCH_PLATFORM_IPHONE) + + // use inline assembler + #if defined(__i386__) || defined(__x86_64__) + #define CATCH_TRAP() __asm__("int $3") + #elif defined(__aarch64__) + #define CATCH_TRAP() __asm__(".inst 0xd4200000") + #elif defined(__arm__) && !defined(__thumb__) + #define CATCH_TRAP() __asm__(".inst 0xe7f001f0") + #elif defined(__arm__) && defined(__thumb__) + #define CATCH_TRAP() __asm__(".inst 0xde01") + #endif + +#elif defined(CATCH_PLATFORM_LINUX) + // If we can use inline assembler, do it because this allows us to break + // directly at the location of the failing check instead of breaking inside + // raise() called from it, i.e. one stack frame below. + #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) + #define CATCH_TRAP() asm volatile ("int $3") /* NOLINT */ + #else // Fall back to the generic way. + #include <signal.h> + + #define CATCH_TRAP() raise(SIGTRAP) + #endif +#elif defined(_MSC_VER) + #define CATCH_TRAP() __debugbreak() +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) void __stdcall DebugBreak(); + #define CATCH_TRAP() DebugBreak() +#endif + +#ifndef CATCH_BREAK_INTO_DEBUGGER + #ifdef CATCH_TRAP + #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }() + #else + #define CATCH_BREAK_INTO_DEBUGGER() []{}() + #endif +#endif + +// end catch_debugger.h +// start catch_run_context.h + +// start catch_fatal_condition.h + +// start catch_windows_h_proxy.h + + +#if defined(CATCH_PLATFORM_WINDOWS) + +#if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX) +# define CATCH_DEFINED_NOMINMAX +# define NOMINMAX +#endif +#if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) +# define CATCH_DEFINED_WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +#endif + +#ifdef __AFXDLL +#include <AfxWin.h> +#else +#include <windows.h> +#endif + +#ifdef CATCH_DEFINED_NOMINMAX +# undef NOMINMAX +#endif +#ifdef CATCH_DEFINED_WIN32_LEAN_AND_MEAN +# undef WIN32_LEAN_AND_MEAN +#endif + +#endif // defined(CATCH_PLATFORM_WINDOWS) + +// end catch_windows_h_proxy.h +#if defined( CATCH_CONFIG_WINDOWS_SEH ) + +namespace Catch { + + struct FatalConditionHandler { + + static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo); + FatalConditionHandler(); + static void reset(); + ~FatalConditionHandler(); + + private: + static bool isSet; + static ULONG guaranteeSize; + static PVOID exceptionHandlerHandle; + }; + +} // namespace Catch + +#elif defined ( CATCH_CONFIG_POSIX_SIGNALS ) + +#include <signal.h> + +namespace Catch { + + struct FatalConditionHandler { + + static bool isSet; + static struct sigaction oldSigActions[]; + static stack_t oldSigStack; + static char altStackMem[]; + + static void handleSignal( int sig ); + + FatalConditionHandler(); + ~FatalConditionHandler(); + static void reset(); + }; + +} // namespace Catch + +#else + +namespace Catch { + struct FatalConditionHandler { + void reset(); + }; +} + +#endif + +// end catch_fatal_condition.h +#include <string> + +namespace Catch { + + struct IMutableContext; + + /////////////////////////////////////////////////////////////////////////// + + class RunContext : public IResultCapture, public IRunner { + + public: + RunContext( RunContext const& ) = delete; + RunContext& operator =( RunContext const& ) = delete; + + explicit RunContext( IConfigPtr const& _config, IStreamingReporterPtr&& reporter ); + + ~RunContext() override; + + void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ); + void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ); + + Totals runTest(TestCase const& testCase); + + IConfigPtr config() const; + IStreamingReporter& reporter() const; + + public: // IResultCapture + + // Assertion handlers + void handleExpr + ( AssertionInfo const& info, + ITransientExpression const& expr, + AssertionReaction& reaction ) override; + void handleMessage + ( AssertionInfo const& info, + ResultWas::OfType resultType, + StringRef const& message, + AssertionReaction& reaction ) override; + void handleUnexpectedExceptionNotThrown + ( AssertionInfo const& info, + AssertionReaction& reaction ) override; + void handleUnexpectedInflightException + ( AssertionInfo const& info, + std::string const& message, + AssertionReaction& reaction ) override; + void handleIncomplete + ( AssertionInfo const& info ) override; + void handleNonExpr + ( AssertionInfo const &info, + ResultWas::OfType resultType, + AssertionReaction &reaction ) override; + + bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) override; + + void sectionEnded( SectionEndInfo const& endInfo ) override; + void sectionEndedEarly( SectionEndInfo const& endInfo ) override; + + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override; + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing( std::string const& name ) override; + void benchmarkStarting( BenchmarkInfo const& info ) override; + void benchmarkEnded( BenchmarkStats<> const& stats ) override; + void benchmarkFailed( std::string const& error ) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void pushScopedMessage( MessageInfo const& message ) override; + void popScopedMessage( MessageInfo const& message ) override; + + void emplaceUnscopedMessage( MessageBuilder const& builder ) override; + + std::string getCurrentTestName() const override; + + const AssertionResult* getLastResult() const override; + + void exceptionEarlyReported() override; + + void handleFatalErrorCondition( StringRef message ) override; + + bool lastAssertionPassed() override; + + void assertionPassed() override; + + public: + // !TBD We need to do this another way! + bool aborting() const final; + + private: + + void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ); + void invokeActiveTestCase(); + + void resetAssertionInfo(); + bool testForMissingAssertions( Counts& assertions ); + + void assertionEnded( AssertionResult const& result ); + void reportExpr + ( AssertionInfo const &info, + ResultWas::OfType resultType, + ITransientExpression const *expr, + bool negated ); + + void populateReaction( AssertionReaction& reaction ); + + private: + + void handleUnfinishedSections(); + + TestRunInfo m_runInfo; + IMutableContext& m_context; + TestCase const* m_activeTestCase = nullptr; + ITracker* m_testCaseTracker = nullptr; + Option<AssertionResult> m_lastResult; + + IConfigPtr m_config; + Totals m_totals; + IStreamingReporterPtr m_reporter; + std::vector<MessageInfo> m_messages; + std::vector<ScopedMessage> m_messageScopes; /* Keeps owners of so-called unscoped messages. */ + AssertionInfo m_lastAssertionInfo; + std::vector<SectionEndInfo> m_unfinishedSections; + std::vector<ITracker*> m_activeSections; + TrackerContext m_trackerContext; + bool m_lastAssertionPassed = false; + bool m_shouldReportUnexpected = true; + bool m_includeSuccessfulResults; + }; + + void seedRng(IConfig const& config); + unsigned int rngSeed(); +} // end namespace Catch + +// end catch_run_context.h +namespace Catch { + + namespace { + auto operator <<( std::ostream& os, ITransientExpression const& expr ) -> std::ostream& { + expr.streamReconstructedExpression( os ); + return os; + } + } + + LazyExpression::LazyExpression( bool isNegated ) + : m_isNegated( isNegated ) + {} + + LazyExpression::LazyExpression( LazyExpression const& other ) : m_isNegated( other.m_isNegated ) {} + + LazyExpression::operator bool() const { + return m_transientExpression != nullptr; + } + + auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream& { + if( lazyExpr.m_isNegated ) + os << "!"; + + if( lazyExpr ) { + if( lazyExpr.m_isNegated && lazyExpr.m_transientExpression->isBinaryExpression() ) + os << "(" << *lazyExpr.m_transientExpression << ")"; + else + os << *lazyExpr.m_transientExpression; + } + else { + os << "{** error - unchecked empty expression requested **}"; + } + return os; + } + + AssertionHandler::AssertionHandler + ( StringRef const& macroName, + SourceLineInfo const& lineInfo, + StringRef capturedExpression, + ResultDisposition::Flags resultDisposition ) + : m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition }, + m_resultCapture( getResultCapture() ) + {} + + void AssertionHandler::handleExpr( ITransientExpression const& expr ) { + m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction ); + } + void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const& message) { + m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction ); + } + + auto AssertionHandler::allowThrows() const -> bool { + return getCurrentContext().getConfig()->allowThrows(); + } + + void AssertionHandler::complete() { + setCompleted(); + if( m_reaction.shouldDebugBreak ) { + + // If you find your debugger stopping you here then go one level up on the + // call-stack for the code that caused it (typically a failed assertion) + + // (To go back to the test and change execution, jump over the throw, next) + CATCH_BREAK_INTO_DEBUGGER(); + } + if (m_reaction.shouldThrow) { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + throw Catch::TestFailureException(); +#else + CATCH_ERROR( "Test failure requires aborting test!" ); +#endif + } + } + void AssertionHandler::setCompleted() { + m_completed = true; + } + + void AssertionHandler::handleUnexpectedInflightException() { + m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction ); + } + + void AssertionHandler::handleExceptionThrownAsExpected() { + m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); + } + void AssertionHandler::handleExceptionNotThrownAsExpected() { + m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); + } + + void AssertionHandler::handleUnexpectedExceptionNotThrown() { + m_resultCapture.handleUnexpectedExceptionNotThrown( m_assertionInfo, m_reaction ); + } + + void AssertionHandler::handleThrowingCallSkipped() { + m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); + } + + // This is the overload that takes a string and infers the Equals matcher from it + // The more general overload, that takes any string matcher, is in catch_capture_matchers.cpp + void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef const& matcherString ) { + handleExceptionMatchExpr( handler, Matchers::Equals( str ), matcherString ); + } + +} // namespace Catch +// end catch_assertionhandler.cpp +// start catch_assertionresult.cpp + +namespace Catch { + AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression): + lazyExpression(_lazyExpression), + resultType(_resultType) {} + + std::string AssertionResultData::reconstructExpression() const { + + if( reconstructedExpression.empty() ) { + if( lazyExpression ) { + ReusableStringStream rss; + rss << lazyExpression; + reconstructedExpression = rss.str(); + } + } + return reconstructedExpression; + } + + AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) + : m_info( info ), + m_resultData( data ) + {} + + // Result was a success + bool AssertionResult::succeeded() const { + return Catch::isOk( m_resultData.resultType ); + } + + // Result was a success, or failure is suppressed + bool AssertionResult::isOk() const { + return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); + } + + ResultWas::OfType AssertionResult::getResultType() const { + return m_resultData.resultType; + } + + bool AssertionResult::hasExpression() const { + return !m_info.capturedExpression.empty(); + } + + bool AssertionResult::hasMessage() const { + return !m_resultData.message.empty(); + } + + std::string AssertionResult::getExpression() const { + // Possibly overallocating by 3 characters should be basically free + std::string expr; expr.reserve(m_info.capturedExpression.size() + 3); + if (isFalseTest(m_info.resultDisposition)) { + expr += "!("; + } + expr += m_info.capturedExpression; + if (isFalseTest(m_info.resultDisposition)) { + expr += ')'; + } + return expr; + } + + std::string AssertionResult::getExpressionInMacro() const { + std::string expr; + if( m_info.macroName.empty() ) + expr = static_cast<std::string>(m_info.capturedExpression); + else { + expr.reserve( m_info.macroName.size() + m_info.capturedExpression.size() + 4 ); + expr += m_info.macroName; + expr += "( "; + expr += m_info.capturedExpression; + expr += " )"; + } + return expr; + } + + bool AssertionResult::hasExpandedExpression() const { + return hasExpression() && getExpandedExpression() != getExpression(); + } + + std::string AssertionResult::getExpandedExpression() const { + std::string expr = m_resultData.reconstructExpression(); + return expr.empty() + ? getExpression() + : expr; + } + + std::string AssertionResult::getMessage() const { + return m_resultData.message; + } + SourceLineInfo AssertionResult::getSourceInfo() const { + return m_info.lineInfo; + } + + StringRef AssertionResult::getTestMacroName() const { + return m_info.macroName; + } + +} // end namespace Catch +// end catch_assertionresult.cpp +// start catch_capture_matchers.cpp + +namespace Catch { + + using StringMatcher = Matchers::Impl::MatcherBase<std::string>; + + // This is the general overload that takes a any string matcher + // There is another overload, in catch_assertionhandler.h/.cpp, that only takes a string and infers + // the Equals matcher (so the header does not mention matchers) + void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef const& matcherString ) { + std::string exceptionMessage = Catch::translateActiveException(); + MatchExpr<std::string, StringMatcher const&> expr( exceptionMessage, matcher, matcherString ); + handler.handleExpr( expr ); + } + +} // namespace Catch +// end catch_capture_matchers.cpp +// start catch_commandline.cpp + +// start catch_commandline.h + +// start catch_clara.h + +// Use Catch's value for console width (store Clara's off to the side, if present) +#ifdef CLARA_CONFIG_CONSOLE_WIDTH +#define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH +#undef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH +#endif +#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH-1 + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wweak-vtables" +#pragma clang diagnostic ignored "-Wexit-time-destructors" +#pragma clang diagnostic ignored "-Wshadow" +#endif + +// start clara.hpp +// Copyright 2017 Two Blue Cubes Ltd. All rights reserved. +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// See https://github.com/philsquared/Clara for more details + +// Clara v1.1.5 + + +#ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH +#define CATCH_CLARA_CONFIG_CONSOLE_WIDTH 80 +#endif + +#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH +#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CLARA_CONFIG_CONSOLE_WIDTH +#endif + +#ifndef CLARA_CONFIG_OPTIONAL_TYPE +#ifdef __has_include +#if __has_include(<optional>) && __cplusplus >= 201703L +#include <optional> +#define CLARA_CONFIG_OPTIONAL_TYPE std::optional +#endif +#endif +#endif + +// ----------- #included from clara_textflow.hpp ----------- + +// TextFlowCpp +// +// A single-header library for wrapping and laying out basic text, by Phil Nash +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// This project is hosted at https://github.com/philsquared/textflowcpp + + +#include <cassert> +#include <ostream> +#include <sstream> +#include <vector> + +#ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH +#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH 80 +#endif + +namespace Catch { +namespace clara { +namespace TextFlow { + +inline auto isWhitespace(char c) -> bool { + static std::string chars = " \t\n\r"; + return chars.find(c) != std::string::npos; +} +inline auto isBreakableBefore(char c) -> bool { + static std::string chars = "[({<|"; + return chars.find(c) != std::string::npos; +} +inline auto isBreakableAfter(char c) -> bool { + static std::string chars = "])}>.,:;*+-=&/\\"; + return chars.find(c) != std::string::npos; +} + +class Columns; + +class Column { + std::vector<std::string> m_strings; + size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH; + size_t m_indent = 0; + size_t m_initialIndent = std::string::npos; + +public: + class iterator { + friend Column; + + Column const& m_column; + size_t m_stringIndex = 0; + size_t m_pos = 0; + + size_t m_len = 0; + size_t m_end = 0; + bool m_suffix = false; + + iterator(Column const& column, size_t stringIndex) + : m_column(column), + m_stringIndex(stringIndex) {} + + auto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; } + + auto isBoundary(size_t at) const -> bool { + assert(at > 0); + assert(at <= line().size()); + + return at == line().size() || + (isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) || + isBreakableBefore(line()[at]) || + isBreakableAfter(line()[at - 1]); + } + + void calcLength() { + assert(m_stringIndex < m_column.m_strings.size()); + + m_suffix = false; + auto width = m_column.m_width - indent(); + m_end = m_pos; + if (line()[m_pos] == '\n') { + ++m_end; + } + while (m_end < line().size() && line()[m_end] != '\n') + ++m_end; + + if (m_end < m_pos + width) { + m_len = m_end - m_pos; + } else { + size_t len = width; + while (len > 0 && !isBoundary(m_pos + len)) + --len; + while (len > 0 && isWhitespace(line()[m_pos + len - 1])) + --len; + + if (len > 0) { + m_len = len; + } else { + m_suffix = true; + m_len = width - 1; + } + } + } + + auto indent() const -> size_t { + auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos; + return initial == std::string::npos ? m_column.m_indent : initial; + } + + auto addIndentAndSuffix(std::string const &plain) const -> std::string { + return std::string(indent(), ' ') + (m_suffix ? plain + "-" : plain); + } + + public: + using difference_type = std::ptrdiff_t; + using value_type = std::string; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::forward_iterator_tag; + + explicit iterator(Column const& column) : m_column(column) { + assert(m_column.m_width > m_column.m_indent); + assert(m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent); + calcLength(); + if (m_len == 0) + m_stringIndex++; // Empty string + } + + auto operator *() const -> std::string { + assert(m_stringIndex < m_column.m_strings.size()); + assert(m_pos <= m_end); + return addIndentAndSuffix(line().substr(m_pos, m_len)); + } + + auto operator ++() -> iterator& { + m_pos += m_len; + if (m_pos < line().size() && line()[m_pos] == '\n') + m_pos += 1; + else + while (m_pos < line().size() && isWhitespace(line()[m_pos])) + ++m_pos; + + if (m_pos == line().size()) { + m_pos = 0; + ++m_stringIndex; + } + if (m_stringIndex < m_column.m_strings.size()) + calcLength(); + return *this; + } + auto operator ++(int) -> iterator { + iterator prev(*this); + operator++(); + return prev; + } + + auto operator ==(iterator const& other) const -> bool { + return + m_pos == other.m_pos && + m_stringIndex == other.m_stringIndex && + &m_column == &other.m_column; + } + auto operator !=(iterator const& other) const -> bool { + return !operator==(other); + } + }; + using const_iterator = iterator; + + explicit Column(std::string const& text) { m_strings.push_back(text); } + + auto width(size_t newWidth) -> Column& { + assert(newWidth > 0); + m_width = newWidth; + return *this; + } + auto indent(size_t newIndent) -> Column& { + m_indent = newIndent; + return *this; + } + auto initialIndent(size_t newIndent) -> Column& { + m_initialIndent = newIndent; + return *this; + } + + auto width() const -> size_t { return m_width; } + auto begin() const -> iterator { return iterator(*this); } + auto end() const -> iterator { return { *this, m_strings.size() }; } + + inline friend std::ostream& operator << (std::ostream& os, Column const& col) { + bool first = true; + for (auto line : col) { + if (first) + first = false; + else + os << "\n"; + os << line; + } + return os; + } + + auto operator + (Column const& other)->Columns; + + auto toString() const -> std::string { + std::ostringstream oss; + oss << *this; + return oss.str(); + } +}; + +class Spacer : public Column { + +public: + explicit Spacer(size_t spaceWidth) : Column("") { + width(spaceWidth); + } +}; + +class Columns { + std::vector<Column> m_columns; + +public: + + class iterator { + friend Columns; + struct EndTag {}; + + std::vector<Column> const& m_columns; + std::vector<Column::iterator> m_iterators; + size_t m_activeIterators; + + iterator(Columns const& columns, EndTag) + : m_columns(columns.m_columns), + m_activeIterators(0) { + m_iterators.reserve(m_columns.size()); + + for (auto const& col : m_columns) + m_iterators.push_back(col.end()); + } + + public: + using difference_type = std::ptrdiff_t; + using value_type = std::string; + using pointer = value_type * ; + using reference = value_type & ; + using iterator_category = std::forward_iterator_tag; + + explicit iterator(Columns const& columns) + : m_columns(columns.m_columns), + m_activeIterators(m_columns.size()) { + m_iterators.reserve(m_columns.size()); + + for (auto const& col : m_columns) + m_iterators.push_back(col.begin()); + } + + auto operator ==(iterator const& other) const -> bool { + return m_iterators == other.m_iterators; + } + auto operator !=(iterator const& other) const -> bool { + return m_iterators != other.m_iterators; + } + auto operator *() const -> std::string { + std::string row, padding; + + for (size_t i = 0; i < m_columns.size(); ++i) { + auto width = m_columns[i].width(); + if (m_iterators[i] != m_columns[i].end()) { + std::string col = *m_iterators[i]; + row += padding + col; + if (col.size() < width) + padding = std::string(width - col.size(), ' '); + else + padding = ""; + } else { + padding += std::string(width, ' '); + } + } + return row; + } + auto operator ++() -> iterator& { + for (size_t i = 0; i < m_columns.size(); ++i) { + if (m_iterators[i] != m_columns[i].end()) + ++m_iterators[i]; + } + return *this; + } + auto operator ++(int) -> iterator { + iterator prev(*this); + operator++(); + return prev; + } + }; + using const_iterator = iterator; + + auto begin() const -> iterator { return iterator(*this); } + auto end() const -> iterator { return { *this, iterator::EndTag() }; } + + auto operator += (Column const& col) -> Columns& { + m_columns.push_back(col); + return *this; + } + auto operator + (Column const& col) -> Columns { + Columns combined = *this; + combined += col; + return combined; + } + + inline friend std::ostream& operator << (std::ostream& os, Columns const& cols) { + + bool first = true; + for (auto line : cols) { + if (first) + first = false; + else + os << "\n"; + os << line; + } + return os; + } + + auto toString() const -> std::string { + std::ostringstream oss; + oss << *this; + return oss.str(); + } +}; + +inline auto Column::operator + (Column const& other) -> Columns { + Columns cols; + cols += *this; + cols += other; + return cols; +} +} + +} +} + +// ----------- end of #include from clara_textflow.hpp ----------- +// ........... back in clara.hpp + +#include <cctype> +#include <string> +#include <memory> +#include <set> +#include <algorithm> + +#if !defined(CATCH_PLATFORM_WINDOWS) && ( defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) ) +#define CATCH_PLATFORM_WINDOWS +#endif + +namespace Catch { namespace clara { +namespace detail { + + // Traits for extracting arg and return type of lambdas (for single argument lambdas) + template<typename L> + struct UnaryLambdaTraits : UnaryLambdaTraits<decltype( &L::operator() )> {}; + + template<typename ClassT, typename ReturnT, typename... Args> + struct UnaryLambdaTraits<ReturnT( ClassT::* )( Args... ) const> { + static const bool isValid = false; + }; + + template<typename ClassT, typename ReturnT, typename ArgT> + struct UnaryLambdaTraits<ReturnT( ClassT::* )( ArgT ) const> { + static const bool isValid = true; + using ArgType = typename std::remove_const<typename std::remove_reference<ArgT>::type>::type; + using ReturnType = ReturnT; + }; + + class TokenStream; + + // Transport for raw args (copied from main args, or supplied via init list for testing) + class Args { + friend TokenStream; + std::string m_exeName; + std::vector<std::string> m_args; + + public: + Args( int argc, char const* const* argv ) + : m_exeName(argv[0]), + m_args(argv + 1, argv + argc) {} + + Args( std::initializer_list<std::string> args ) + : m_exeName( *args.begin() ), + m_args( args.begin()+1, args.end() ) + {} + + auto exeName() const -> std::string { + return m_exeName; + } + }; + + // Wraps a token coming from a token stream. These may not directly correspond to strings as a single string + // may encode an option + its argument if the : or = form is used + enum class TokenType { + Option, Argument + }; + struct Token { + TokenType type; + std::string token; + }; + + inline auto isOptPrefix( char c ) -> bool { + return c == '-' +#ifdef CATCH_PLATFORM_WINDOWS + || c == '/' +#endif + ; + } + + // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled + class TokenStream { + using Iterator = std::vector<std::string>::const_iterator; + Iterator it; + Iterator itEnd; + std::vector<Token> m_tokenBuffer; + + void loadBuffer() { + m_tokenBuffer.resize( 0 ); + + // Skip any empty strings + while( it != itEnd && it->empty() ) + ++it; + + if( it != itEnd ) { + auto const &next = *it; + if( isOptPrefix( next[0] ) ) { + auto delimiterPos = next.find_first_of( " :=" ); + if( delimiterPos != std::string::npos ) { + m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); + m_tokenBuffer.push_back( { TokenType::Argument, next.substr( delimiterPos + 1 ) } ); + } else { + if( next[1] != '-' && next.size() > 2 ) { + std::string opt = "- "; + for( size_t i = 1; i < next.size(); ++i ) { + opt[1] = next[i]; + m_tokenBuffer.push_back( { TokenType::Option, opt } ); + } + } else { + m_tokenBuffer.push_back( { TokenType::Option, next } ); + } + } + } else { + m_tokenBuffer.push_back( { TokenType::Argument, next } ); + } + } + } + + public: + explicit TokenStream( Args const &args ) : TokenStream( args.m_args.begin(), args.m_args.end() ) {} + + TokenStream( Iterator it, Iterator itEnd ) : it( it ), itEnd( itEnd ) { + loadBuffer(); + } + + explicit operator bool() const { + return !m_tokenBuffer.empty() || it != itEnd; + } + + auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); } + + auto operator*() const -> Token { + assert( !m_tokenBuffer.empty() ); + return m_tokenBuffer.front(); + } + + auto operator->() const -> Token const * { + assert( !m_tokenBuffer.empty() ); + return &m_tokenBuffer.front(); + } + + auto operator++() -> TokenStream & { + if( m_tokenBuffer.size() >= 2 ) { + m_tokenBuffer.erase( m_tokenBuffer.begin() ); + } else { + if( it != itEnd ) + ++it; + loadBuffer(); + } + return *this; + } + }; + + class ResultBase { + public: + enum Type { + Ok, LogicError, RuntimeError + }; + + protected: + ResultBase( Type type ) : m_type( type ) {} + virtual ~ResultBase() = default; + + virtual void enforceOk() const = 0; + + Type m_type; + }; + + template<typename T> + class ResultValueBase : public ResultBase { + public: + auto value() const -> T const & { + enforceOk(); + return m_value; + } + + protected: + ResultValueBase( Type type ) : ResultBase( type ) {} + + ResultValueBase( ResultValueBase const &other ) : ResultBase( other ) { + if( m_type == ResultBase::Ok ) + new( &m_value ) T( other.m_value ); + } + + ResultValueBase( Type, T const &value ) : ResultBase( Ok ) { + new( &m_value ) T( value ); + } + + auto operator=( ResultValueBase const &other ) -> ResultValueBase & { + if( m_type == ResultBase::Ok ) + m_value.~T(); + ResultBase::operator=(other); + if( m_type == ResultBase::Ok ) + new( &m_value ) T( other.m_value ); + return *this; + } + + ~ResultValueBase() override { + if( m_type == Ok ) + m_value.~T(); + } + + union { + T m_value; + }; + }; + + template<> + class ResultValueBase<void> : public ResultBase { + protected: + using ResultBase::ResultBase; + }; + + template<typename T = void> + class BasicResult : public ResultValueBase<T> { + public: + template<typename U> + explicit BasicResult( BasicResult<U> const &other ) + : ResultValueBase<T>( other.type() ), + m_errorMessage( other.errorMessage() ) + { + assert( type() != ResultBase::Ok ); + } + + template<typename U> + static auto ok( U const &value ) -> BasicResult { return { ResultBase::Ok, value }; } + static auto ok() -> BasicResult { return { ResultBase::Ok }; } + static auto logicError( std::string const &message ) -> BasicResult { return { ResultBase::LogicError, message }; } + static auto runtimeError( std::string const &message ) -> BasicResult { return { ResultBase::RuntimeError, message }; } + + explicit operator bool() const { return m_type == ResultBase::Ok; } + auto type() const -> ResultBase::Type { return m_type; } + auto errorMessage() const -> std::string { return m_errorMessage; } + + protected: + void enforceOk() const override { + + // Errors shouldn't reach this point, but if they do + // the actual error message will be in m_errorMessage + assert( m_type != ResultBase::LogicError ); + assert( m_type != ResultBase::RuntimeError ); + if( m_type != ResultBase::Ok ) + std::abort(); + } + + std::string m_errorMessage; // Only populated if resultType is an error + + BasicResult( ResultBase::Type type, std::string const &message ) + : ResultValueBase<T>(type), + m_errorMessage(message) + { + assert( m_type != ResultBase::Ok ); + } + + using ResultValueBase<T>::ResultValueBase; + using ResultBase::m_type; + }; + + enum class ParseResultType { + Matched, NoMatch, ShortCircuitAll, ShortCircuitSame + }; + + class ParseState { + public: + + ParseState( ParseResultType type, TokenStream const &remainingTokens ) + : m_type(type), + m_remainingTokens( remainingTokens ) + {} + + auto type() const -> ParseResultType { return m_type; } + auto remainingTokens() const -> TokenStream { return m_remainingTokens; } + + private: + ParseResultType m_type; + TokenStream m_remainingTokens; + }; + + using Result = BasicResult<void>; + using ParserResult = BasicResult<ParseResultType>; + using InternalParseResult = BasicResult<ParseState>; + + struct HelpColumns { + std::string left; + std::string right; + }; + + template<typename T> + inline auto convertInto( std::string const &source, T& target ) -> ParserResult { + std::stringstream ss; + ss << source; + ss >> target; + if( ss.fail() ) + return ParserResult::runtimeError( "Unable to convert '" + source + "' to destination type" ); + else + return ParserResult::ok( ParseResultType::Matched ); + } + inline auto convertInto( std::string const &source, std::string& target ) -> ParserResult { + target = source; + return ParserResult::ok( ParseResultType::Matched ); + } + inline auto convertInto( std::string const &source, bool &target ) -> ParserResult { + std::string srcLC = source; + std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( unsigned char c ) { return static_cast<char>( std::tolower(c) ); } ); + if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on") + target = true; + else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off") + target = false; + else + return ParserResult::runtimeError( "Expected a boolean value but did not recognise: '" + source + "'" ); + return ParserResult::ok( ParseResultType::Matched ); + } +#ifdef CLARA_CONFIG_OPTIONAL_TYPE + template<typename T> + inline auto convertInto( std::string const &source, CLARA_CONFIG_OPTIONAL_TYPE<T>& target ) -> ParserResult { + T temp; + auto result = convertInto( source, temp ); + if( result ) + target = std::move(temp); + return result; + } +#endif // CLARA_CONFIG_OPTIONAL_TYPE + + struct NonCopyable { + NonCopyable() = default; + NonCopyable( NonCopyable const & ) = delete; + NonCopyable( NonCopyable && ) = delete; + NonCopyable &operator=( NonCopyable const & ) = delete; + NonCopyable &operator=( NonCopyable && ) = delete; + }; + + struct BoundRef : NonCopyable { + virtual ~BoundRef() = default; + virtual auto isContainer() const -> bool { return false; } + virtual auto isFlag() const -> bool { return false; } + }; + struct BoundValueRefBase : BoundRef { + virtual auto setValue( std::string const &arg ) -> ParserResult = 0; + }; + struct BoundFlagRefBase : BoundRef { + virtual auto setFlag( bool flag ) -> ParserResult = 0; + virtual auto isFlag() const -> bool { return true; } + }; + + template<typename T> + struct BoundValueRef : BoundValueRefBase { + T &m_ref; + + explicit BoundValueRef( T &ref ) : m_ref( ref ) {} + + auto setValue( std::string const &arg ) -> ParserResult override { + return convertInto( arg, m_ref ); + } + }; + + template<typename T> + struct BoundValueRef<std::vector<T>> : BoundValueRefBase { + std::vector<T> &m_ref; + + explicit BoundValueRef( std::vector<T> &ref ) : m_ref( ref ) {} + + auto isContainer() const -> bool override { return true; } + + auto setValue( std::string const &arg ) -> ParserResult override { + T temp; + auto result = convertInto( arg, temp ); + if( result ) + m_ref.push_back( temp ); + return result; + } + }; + + struct BoundFlagRef : BoundFlagRefBase { + bool &m_ref; + + explicit BoundFlagRef( bool &ref ) : m_ref( ref ) {} + + auto setFlag( bool flag ) -> ParserResult override { + m_ref = flag; + return ParserResult::ok( ParseResultType::Matched ); + } + }; + + template<typename ReturnType> + struct LambdaInvoker { + static_assert( std::is_same<ReturnType, ParserResult>::value, "Lambda must return void or clara::ParserResult" ); + + template<typename L, typename ArgType> + static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { + return lambda( arg ); + } + }; + + template<> + struct LambdaInvoker<void> { + template<typename L, typename ArgType> + static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { + lambda( arg ); + return ParserResult::ok( ParseResultType::Matched ); + } + }; + + template<typename ArgType, typename L> + inline auto invokeLambda( L const &lambda, std::string const &arg ) -> ParserResult { + ArgType temp{}; + auto result = convertInto( arg, temp ); + return !result + ? result + : LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( lambda, temp ); + } + + template<typename L> + struct BoundLambda : BoundValueRefBase { + L m_lambda; + + static_assert( UnaryLambdaTraits<L>::isValid, "Supplied lambda must take exactly one argument" ); + explicit BoundLambda( L const &lambda ) : m_lambda( lambda ) {} + + auto setValue( std::string const &arg ) -> ParserResult override { + return invokeLambda<typename UnaryLambdaTraits<L>::ArgType>( m_lambda, arg ); + } + }; + + template<typename L> + struct BoundFlagLambda : BoundFlagRefBase { + L m_lambda; + + static_assert( UnaryLambdaTraits<L>::isValid, "Supplied lambda must take exactly one argument" ); + static_assert( std::is_same<typename UnaryLambdaTraits<L>::ArgType, bool>::value, "flags must be boolean" ); + + explicit BoundFlagLambda( L const &lambda ) : m_lambda( lambda ) {} + + auto setFlag( bool flag ) -> ParserResult override { + return LambdaInvoker<typename UnaryLambdaTraits<L>::ReturnType>::invoke( m_lambda, flag ); + } + }; + + enum class Optionality { Optional, Required }; + + struct Parser; + + class ParserBase { + public: + virtual ~ParserBase() = default; + virtual auto validate() const -> Result { return Result::ok(); } + virtual auto parse( std::string const& exeName, TokenStream const &tokens) const -> InternalParseResult = 0; + virtual auto cardinality() const -> size_t { return 1; } + + auto parse( Args const &args ) const -> InternalParseResult { + return parse( args.exeName(), TokenStream( args ) ); + } + }; + + template<typename DerivedT> + class ComposableParserImpl : public ParserBase { + public: + template<typename T> + auto operator|( T const &other ) const -> Parser; + + template<typename T> + auto operator+( T const &other ) const -> Parser; + }; + + // Common code and state for Args and Opts + template<typename DerivedT> + class ParserRefImpl : public ComposableParserImpl<DerivedT> { + protected: + Optionality m_optionality = Optionality::Optional; + std::shared_ptr<BoundRef> m_ref; + std::string m_hint; + std::string m_description; + + explicit ParserRefImpl( std::shared_ptr<BoundRef> const &ref ) : m_ref( ref ) {} + + public: + template<typename T> + ParserRefImpl( T &ref, std::string const &hint ) + : m_ref( std::make_shared<BoundValueRef<T>>( ref ) ), + m_hint( hint ) + {} + + template<typename LambdaT> + ParserRefImpl( LambdaT const &ref, std::string const &hint ) + : m_ref( std::make_shared<BoundLambda<LambdaT>>( ref ) ), + m_hint(hint) + {} + + auto operator()( std::string const &description ) -> DerivedT & { + m_description = description; + return static_cast<DerivedT &>( *this ); + } + + auto optional() -> DerivedT & { + m_optionality = Optionality::Optional; + return static_cast<DerivedT &>( *this ); + }; + + auto required() -> DerivedT & { + m_optionality = Optionality::Required; + return static_cast<DerivedT &>( *this ); + }; + + auto isOptional() const -> bool { + return m_optionality == Optionality::Optional; + } + + auto cardinality() const -> size_t override { + if( m_ref->isContainer() ) + return 0; + else + return 1; + } + + auto hint() const -> std::string { return m_hint; } + }; + + class ExeName : public ComposableParserImpl<ExeName> { + std::shared_ptr<std::string> m_name; + std::shared_ptr<BoundValueRefBase> m_ref; + + template<typename LambdaT> + static auto makeRef(LambdaT const &lambda) -> std::shared_ptr<BoundValueRefBase> { + return std::make_shared<BoundLambda<LambdaT>>( lambda) ; + } + + public: + ExeName() : m_name( std::make_shared<std::string>( "<executable>" ) ) {} + + explicit ExeName( std::string &ref ) : ExeName() { + m_ref = std::make_shared<BoundValueRef<std::string>>( ref ); + } + + template<typename LambdaT> + explicit ExeName( LambdaT const& lambda ) : ExeName() { + m_ref = std::make_shared<BoundLambda<LambdaT>>( lambda ); + } + + // The exe name is not parsed out of the normal tokens, but is handled specially + auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { + return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); + } + + auto name() const -> std::string { return *m_name; } + auto set( std::string const& newName ) -> ParserResult { + + auto lastSlash = newName.find_last_of( "\\/" ); + auto filename = ( lastSlash == std::string::npos ) + ? newName + : newName.substr( lastSlash+1 ); + + *m_name = filename; + if( m_ref ) + return m_ref->setValue( filename ); + else + return ParserResult::ok( ParseResultType::Matched ); + } + }; + + class Arg : public ParserRefImpl<Arg> { + public: + using ParserRefImpl::ParserRefImpl; + + auto parse( std::string const &, TokenStream const &tokens ) const -> InternalParseResult override { + auto validationResult = validate(); + if( !validationResult ) + return InternalParseResult( validationResult ); + + auto remainingTokens = tokens; + auto const &token = *remainingTokens; + if( token.type != TokenType::Argument ) + return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); + + assert( !m_ref->isFlag() ); + auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); + + auto result = valueRef->setValue( remainingTokens->token ); + if( !result ) + return InternalParseResult( result ); + else + return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); + } + }; + + inline auto normaliseOpt( std::string const &optName ) -> std::string { +#ifdef CATCH_PLATFORM_WINDOWS + if( optName[0] == '/' ) + return "-" + optName.substr( 1 ); + else +#endif + return optName; + } + + class Opt : public ParserRefImpl<Opt> { + protected: + std::vector<std::string> m_optNames; + + public: + template<typename LambdaT> + explicit Opt( LambdaT const &ref ) : ParserRefImpl( std::make_shared<BoundFlagLambda<LambdaT>>( ref ) ) {} + + explicit Opt( bool &ref ) : ParserRefImpl( std::make_shared<BoundFlagRef>( ref ) ) {} + + template<typename LambdaT> + Opt( LambdaT const &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} + + template<typename T> + Opt( T &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} + + auto operator[]( std::string const &optName ) -> Opt & { + m_optNames.push_back( optName ); + return *this; + } + + auto getHelpColumns() const -> std::vector<HelpColumns> { + std::ostringstream oss; + bool first = true; + for( auto const &opt : m_optNames ) { + if (first) + first = false; + else + oss << ", "; + oss << opt; + } + if( !m_hint.empty() ) + oss << " <" << m_hint << ">"; + return { { oss.str(), m_description } }; + } + + auto isMatch( std::string const &optToken ) const -> bool { + auto normalisedToken = normaliseOpt( optToken ); + for( auto const &name : m_optNames ) { + if( normaliseOpt( name ) == normalisedToken ) + return true; + } + return false; + } + + using ParserBase::parse; + + auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { + auto validationResult = validate(); + if( !validationResult ) + return InternalParseResult( validationResult ); + + auto remainingTokens = tokens; + if( remainingTokens && remainingTokens->type == TokenType::Option ) { + auto const &token = *remainingTokens; + if( isMatch(token.token ) ) { + if( m_ref->isFlag() ) { + auto flagRef = static_cast<detail::BoundFlagRefBase*>( m_ref.get() ); + auto result = flagRef->setFlag( true ); + if( !result ) + return InternalParseResult( result ); + if( result.value() == ParseResultType::ShortCircuitAll ) + return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); + } else { + auto valueRef = static_cast<detail::BoundValueRefBase*>( m_ref.get() ); + ++remainingTokens; + if( !remainingTokens ) + return InternalParseResult::runtimeError( "Expected argument following " + token.token ); + auto const &argToken = *remainingTokens; + if( argToken.type != TokenType::Argument ) + return InternalParseResult::runtimeError( "Expected argument following " + token.token ); + auto result = valueRef->setValue( argToken.token ); + if( !result ) + return InternalParseResult( result ); + if( result.value() == ParseResultType::ShortCircuitAll ) + return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); + } + return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); + } + } + return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); + } + + auto validate() const -> Result override { + if( m_optNames.empty() ) + return Result::logicError( "No options supplied to Opt" ); + for( auto const &name : m_optNames ) { + if( name.empty() ) + return Result::logicError( "Option name cannot be empty" ); +#ifdef CATCH_PLATFORM_WINDOWS + if( name[0] != '-' && name[0] != '/' ) + return Result::logicError( "Option name must begin with '-' or '/'" ); +#else + if( name[0] != '-' ) + return Result::logicError( "Option name must begin with '-'" ); +#endif + } + return ParserRefImpl::validate(); + } + }; + + struct Help : Opt { + Help( bool &showHelpFlag ) + : Opt([&]( bool flag ) { + showHelpFlag = flag; + return ParserResult::ok( ParseResultType::ShortCircuitAll ); + }) + { + static_cast<Opt &>( *this ) + ("display usage information") + ["-?"]["-h"]["--help"] + .optional(); + } + }; + + struct Parser : ParserBase { + + mutable ExeName m_exeName; + std::vector<Opt> m_options; + std::vector<Arg> m_args; + + auto operator|=( ExeName const &exeName ) -> Parser & { + m_exeName = exeName; + return *this; + } + + auto operator|=( Arg const &arg ) -> Parser & { + m_args.push_back(arg); + return *this; + } + + auto operator|=( Opt const &opt ) -> Parser & { + m_options.push_back(opt); + return *this; + } + + auto operator|=( Parser const &other ) -> Parser & { + m_options.insert(m_options.end(), other.m_options.begin(), other.m_options.end()); + m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end()); + return *this; + } + + template<typename T> + auto operator|( T const &other ) const -> Parser { + return Parser( *this ) |= other; + } + + // Forward deprecated interface with '+' instead of '|' + template<typename T> + auto operator+=( T const &other ) -> Parser & { return operator|=( other ); } + template<typename T> + auto operator+( T const &other ) const -> Parser { return operator|( other ); } + + auto getHelpColumns() const -> std::vector<HelpColumns> { + std::vector<HelpColumns> cols; + for (auto const &o : m_options) { + auto childCols = o.getHelpColumns(); + cols.insert( cols.end(), childCols.begin(), childCols.end() ); + } + return cols; + } + + void writeToStream( std::ostream &os ) const { + if (!m_exeName.name().empty()) { + os << "usage:\n" << " " << m_exeName.name() << " "; + bool required = true, first = true; + for( auto const &arg : m_args ) { + if (first) + first = false; + else + os << " "; + if( arg.isOptional() && required ) { + os << "["; + required = false; + } + os << "<" << arg.hint() << ">"; + if( arg.cardinality() == 0 ) + os << " ... "; + } + if( !required ) + os << "]"; + if( !m_options.empty() ) + os << " options"; + os << "\n\nwhere options are:" << std::endl; + } + + auto rows = getHelpColumns(); + size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH; + size_t optWidth = 0; + for( auto const &cols : rows ) + optWidth = (std::max)(optWidth, cols.left.size() + 2); + + optWidth = (std::min)(optWidth, consoleWidth/2); + + for( auto const &cols : rows ) { + auto row = + TextFlow::Column( cols.left ).width( optWidth ).indent( 2 ) + + TextFlow::Spacer(4) + + TextFlow::Column( cols.right ).width( consoleWidth - 7 - optWidth ); + os << row << std::endl; + } + } + + friend auto operator<<( std::ostream &os, Parser const &parser ) -> std::ostream& { + parser.writeToStream( os ); + return os; + } + + auto validate() const -> Result override { + for( auto const &opt : m_options ) { + auto result = opt.validate(); + if( !result ) + return result; + } + for( auto const &arg : m_args ) { + auto result = arg.validate(); + if( !result ) + return result; + } + return Result::ok(); + } + + using ParserBase::parse; + + auto parse( std::string const& exeName, TokenStream const &tokens ) const -> InternalParseResult override { + + struct ParserInfo { + ParserBase const* parser = nullptr; + size_t count = 0; + }; + const size_t totalParsers = m_options.size() + m_args.size(); + assert( totalParsers < 512 ); + // ParserInfo parseInfos[totalParsers]; // <-- this is what we really want to do + ParserInfo parseInfos[512]; + + { + size_t i = 0; + for (auto const &opt : m_options) parseInfos[i++].parser = &opt; + for (auto const &arg : m_args) parseInfos[i++].parser = &arg; + } + + m_exeName.set( exeName ); + + auto result = InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); + while( result.value().remainingTokens() ) { + bool tokenParsed = false; + + for( size_t i = 0; i < totalParsers; ++i ) { + auto& parseInfo = parseInfos[i]; + if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) { + result = parseInfo.parser->parse(exeName, result.value().remainingTokens()); + if (!result) + return result; + if (result.value().type() != ParseResultType::NoMatch) { + tokenParsed = true; + ++parseInfo.count; + break; + } + } + } + + if( result.value().type() == ParseResultType::ShortCircuitAll ) + return result; + if( !tokenParsed ) + return InternalParseResult::runtimeError( "Unrecognised token: " + result.value().remainingTokens()->token ); + } + // !TBD Check missing required options + return result; + } + }; + + template<typename DerivedT> + template<typename T> + auto ComposableParserImpl<DerivedT>::operator|( T const &other ) const -> Parser { + return Parser() | static_cast<DerivedT const &>( *this ) | other; + } +} // namespace detail + +// A Combined parser +using detail::Parser; + +// A parser for options +using detail::Opt; + +// A parser for arguments +using detail::Arg; + +// Wrapper for argc, argv from main() +using detail::Args; + +// Specifies the name of the executable +using detail::ExeName; + +// Convenience wrapper for option parser that specifies the help option +using detail::Help; + +// enum of result types from a parse +using detail::ParseResultType; + +// Result type for parser operation +using detail::ParserResult; + +}} // namespace Catch::clara + +// end clara.hpp +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// Restore Clara's value for console width, if present +#ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH +#endif + +// end catch_clara.h +namespace Catch { + + clara::Parser makeCommandLineParser( ConfigData& config ); + +} // end namespace Catch + +// end catch_commandline.h +#include <fstream> +#include <ctime> + +namespace Catch { + + clara::Parser makeCommandLineParser( ConfigData& config ) { + + using namespace clara; + + auto const setWarning = [&]( std::string const& warning ) { + auto warningSet = [&]() { + if( warning == "NoAssertions" ) + return WarnAbout::NoAssertions; + + if ( warning == "NoTests" ) + return WarnAbout::NoTests; + + return WarnAbout::Nothing; + }(); + + if (warningSet == WarnAbout::Nothing) + return ParserResult::runtimeError( "Unrecognised warning: '" + warning + "'" ); + config.warnings = static_cast<WarnAbout::What>( config.warnings | warningSet ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const loadTestNamesFromFile = [&]( std::string const& filename ) { + std::ifstream f( filename.c_str() ); + if( !f.is_open() ) + return ParserResult::runtimeError( "Unable to load input file: '" + filename + "'" ); + + std::string line; + while( std::getline( f, line ) ) { + line = trim(line); + if( !line.empty() && !startsWith( line, '#' ) ) { + if( !startsWith( line, '"' ) ) + line = '"' + line + '"'; + config.testsOrTags.push_back( line ); + config.testsOrTags.emplace_back( "," ); + } + } + //Remove comma in the end + if(!config.testsOrTags.empty()) + config.testsOrTags.erase( config.testsOrTags.end()-1 ); + + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setTestOrder = [&]( std::string const& order ) { + if( startsWith( "declared", order ) ) + config.runOrder = RunTests::InDeclarationOrder; + else if( startsWith( "lexical", order ) ) + config.runOrder = RunTests::InLexicographicalOrder; + else if( startsWith( "random", order ) ) + config.runOrder = RunTests::InRandomOrder; + else + return clara::ParserResult::runtimeError( "Unrecognised ordering: '" + order + "'" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setRngSeed = [&]( std::string const& seed ) { + if( seed != "time" ) + return clara::detail::convertInto( seed, config.rngSeed ); + config.rngSeed = static_cast<unsigned int>( std::time(nullptr) ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setColourUsage = [&]( std::string const& useColour ) { + auto mode = toLower( useColour ); + + if( mode == "yes" ) + config.useColour = UseColour::Yes; + else if( mode == "no" ) + config.useColour = UseColour::No; + else if( mode == "auto" ) + config.useColour = UseColour::Auto; + else + return ParserResult::runtimeError( "colour mode must be one of: auto, yes or no. '" + useColour + "' not recognised" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setWaitForKeypress = [&]( std::string const& keypress ) { + auto keypressLc = toLower( keypress ); + if (keypressLc == "never") + config.waitForKeypress = WaitForKeypress::Never; + else if( keypressLc == "start" ) + config.waitForKeypress = WaitForKeypress::BeforeStart; + else if( keypressLc == "exit" ) + config.waitForKeypress = WaitForKeypress::BeforeExit; + else if( keypressLc == "both" ) + config.waitForKeypress = WaitForKeypress::BeforeStartAndExit; + else + return ParserResult::runtimeError( "keypress argument must be one of: never, start, exit or both. '" + keypress + "' not recognised" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setVerbosity = [&]( std::string const& verbosity ) { + auto lcVerbosity = toLower( verbosity ); + if( lcVerbosity == "quiet" ) + config.verbosity = Verbosity::Quiet; + else if( lcVerbosity == "normal" ) + config.verbosity = Verbosity::Normal; + else if( lcVerbosity == "high" ) + config.verbosity = Verbosity::High; + else + return ParserResult::runtimeError( "Unrecognised verbosity, '" + verbosity + "'" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + auto const setReporter = [&]( std::string const& reporter ) { + IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); + + auto lcReporter = toLower( reporter ); + auto result = factories.find( lcReporter ); + + if( factories.end() != result ) + config.reporterName = lcReporter; + else + return ParserResult::runtimeError( "Unrecognized reporter, '" + reporter + "'. Check available with --list-reporters" ); + return ParserResult::ok( ParseResultType::Matched ); + }; + + auto cli + = ExeName( config.processName ) + | Help( config.showHelp ) + | Opt( config.listTests ) + ["-l"]["--list-tests"] + ( "list all/matching test cases" ) + | Opt( config.listTags ) + ["-t"]["--list-tags"] + ( "list all/matching tags" ) + | Opt( config.showSuccessfulTests ) + ["-s"]["--success"] + ( "include successful tests in output" ) + | Opt( config.shouldDebugBreak ) + ["-b"]["--break"] + ( "break into debugger on failure" ) + | Opt( config.noThrow ) + ["-e"]["--nothrow"] + ( "skip exception tests" ) + | Opt( config.showInvisibles ) + ["-i"]["--invisibles"] + ( "show invisibles (tabs, newlines)" ) + | Opt( config.outputFilename, "filename" ) + ["-o"]["--out"] + ( "output filename" ) + | Opt( setReporter, "name" ) + ["-r"]["--reporter"] + ( "reporter to use (defaults to console)" ) + | Opt( config.name, "name" ) + ["-n"]["--name"] + ( "suite name" ) + | Opt( [&]( bool ){ config.abortAfter = 1; } ) + ["-a"]["--abort"] + ( "abort at first failure" ) + | Opt( [&]( int x ){ config.abortAfter = x; }, "no. failures" ) + ["-x"]["--abortx"] + ( "abort after x failures" ) + | Opt( setWarning, "warning name" ) + ["-w"]["--warn"] + ( "enable warnings" ) + | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, "yes|no" ) + ["-d"]["--durations"] + ( "show test durations" ) + | Opt( config.minDuration, "seconds" ) + ["-D"]["--min-duration"] + ( "show test durations for tests taking at least the given number of seconds" ) + | Opt( loadTestNamesFromFile, "filename" ) + ["-f"]["--input-file"] + ( "load test names to run from a file" ) + | Opt( config.filenamesAsTags ) + ["-#"]["--filenames-as-tags"] + ( "adds a tag for the filename" ) + | Opt( config.sectionsToRun, "section name" ) + ["-c"]["--section"] + ( "specify section to run" ) + | Opt( setVerbosity, "quiet|normal|high" ) + ["-v"]["--verbosity"] + ( "set output verbosity" ) + | Opt( config.listTestNamesOnly ) + ["--list-test-names-only"] + ( "list all/matching test cases names only" ) + | Opt( config.listReporters ) + ["--list-reporters"] + ( "list all reporters" ) + | Opt( setTestOrder, "decl|lex|rand" ) + ["--order"] + ( "test case order (defaults to decl)" ) + | Opt( setRngSeed, "'time'|number" ) + ["--rng-seed"] + ( "set a specific seed for random numbers" ) + | Opt( setColourUsage, "yes|no" ) + ["--use-colour"] + ( "should output be colourised" ) + | Opt( config.libIdentify ) + ["--libidentify"] + ( "report name and version according to libidentify standard" ) + | Opt( setWaitForKeypress, "never|start|exit|both" ) + ["--wait-for-keypress"] + ( "waits for a keypress before exiting" ) + | Opt( config.benchmarkSamples, "samples" ) + ["--benchmark-samples"] + ( "number of samples to collect (default: 100)" ) + | Opt( config.benchmarkResamples, "resamples" ) + ["--benchmark-resamples"] + ( "number of resamples for the bootstrap (default: 100000)" ) + | Opt( config.benchmarkConfidenceInterval, "confidence interval" ) + ["--benchmark-confidence-interval"] + ( "confidence interval for the bootstrap (between 0 and 1, default: 0.95)" ) + | Opt( config.benchmarkNoAnalysis ) + ["--benchmark-no-analysis"] + ( "perform only measurements; do not perform any analysis" ) + | Opt( config.benchmarkWarmupTime, "benchmarkWarmupTime" ) + ["--benchmark-warmup-time"] + ( "amount of time in milliseconds spent on warming up each test (default: 100)" ) + | Arg( config.testsOrTags, "test name|pattern|tags" ) + ( "which test or tests to use" ); + + return cli; + } + +} // end namespace Catch +// end catch_commandline.cpp +// start catch_common.cpp + +#include <cstring> +#include <ostream> + +namespace Catch { + + bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const noexcept { + return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); + } + bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const noexcept { + // We can assume that the same file will usually have the same pointer. + // Thus, if the pointers are the same, there is no point in calling the strcmp + return line < other.line || ( line == other.line && file != other.file && (std::strcmp(file, other.file) < 0)); + } + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { +#ifndef __GNUG__ + os << info.file << '(' << info.line << ')'; +#else + os << info.file << ':' << info.line; +#endif + return os; + } + + std::string StreamEndStop::operator+() const { + return std::string(); + } + + NonCopyable::NonCopyable() = default; + NonCopyable::~NonCopyable() = default; + +} +// end catch_common.cpp +// start catch_config.cpp + +namespace Catch { + + Config::Config( ConfigData const& data ) + : m_data( data ), + m_stream( openStream() ) + { + // We need to trim filter specs to avoid trouble with superfluous + // whitespace (esp. important for bdd macros, as those are manually + // aligned with whitespace). + + for (auto& elem : m_data.testsOrTags) { + elem = trim(elem); + } + for (auto& elem : m_data.sectionsToRun) { + elem = trim(elem); + } + + TestSpecParser parser(ITagAliasRegistry::get()); + if (!m_data.testsOrTags.empty()) { + m_hasTestFilters = true; + for (auto const& testOrTags : m_data.testsOrTags) { + parser.parse(testOrTags); + } + } + m_testSpec = parser.testSpec(); + } + + std::string const& Config::getFilename() const { + return m_data.outputFilename ; + } + + bool Config::listTests() const { return m_data.listTests; } + bool Config::listTestNamesOnly() const { return m_data.listTestNamesOnly; } + bool Config::listTags() const { return m_data.listTags; } + bool Config::listReporters() const { return m_data.listReporters; } + + std::string Config::getProcessName() const { return m_data.processName; } + std::string const& Config::getReporterName() const { return m_data.reporterName; } + + std::vector<std::string> const& Config::getTestsOrTags() const { return m_data.testsOrTags; } + std::vector<std::string> const& Config::getSectionsToRun() const { return m_data.sectionsToRun; } + + TestSpec const& Config::testSpec() const { return m_testSpec; } + bool Config::hasTestFilters() const { return m_hasTestFilters; } + + bool Config::showHelp() const { return m_data.showHelp; } + + // IConfig interface + bool Config::allowThrows() const { return !m_data.noThrow; } + std::ostream& Config::stream() const { return m_stream->stream(); } + std::string Config::name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } + bool Config::includeSuccessfulResults() const { return m_data.showSuccessfulTests; } + bool Config::warnAboutMissingAssertions() const { return !!(m_data.warnings & WarnAbout::NoAssertions); } + bool Config::warnAboutNoTests() const { return !!(m_data.warnings & WarnAbout::NoTests); } + ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; } + double Config::minDuration() const { return m_data.minDuration; } + RunTests::InWhatOrder Config::runOrder() const { return m_data.runOrder; } + unsigned int Config::rngSeed() const { return m_data.rngSeed; } + UseColour::YesOrNo Config::useColour() const { return m_data.useColour; } + bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; } + int Config::abortAfter() const { return m_data.abortAfter; } + bool Config::showInvisibles() const { return m_data.showInvisibles; } + Verbosity Config::verbosity() const { return m_data.verbosity; } + + bool Config::benchmarkNoAnalysis() const { return m_data.benchmarkNoAnalysis; } + int Config::benchmarkSamples() const { return m_data.benchmarkSamples; } + double Config::benchmarkConfidenceInterval() const { return m_data.benchmarkConfidenceInterval; } + unsigned int Config::benchmarkResamples() const { return m_data.benchmarkResamples; } + std::chrono::milliseconds Config::benchmarkWarmupTime() const { return std::chrono::milliseconds(m_data.benchmarkWarmupTime); } + + IStream const* Config::openStream() { + return Catch::makeStream(m_data.outputFilename); + } + +} // end namespace Catch +// end catch_config.cpp +// start catch_console_colour.cpp + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wexit-time-destructors" +#endif + +// start catch_errno_guard.h + +namespace Catch { + + class ErrnoGuard { + public: + ErrnoGuard(); + ~ErrnoGuard(); + private: + int m_oldErrno; + }; + +} + +// end catch_errno_guard.h +#include <sstream> + +namespace Catch { + namespace { + + struct IColourImpl { + virtual ~IColourImpl() = default; + virtual void use( Colour::Code _colourCode ) = 0; + }; + + struct NoColourImpl : IColourImpl { + void use( Colour::Code ) override {} + + static IColourImpl* instance() { + static NoColourImpl s_instance; + return &s_instance; + } + }; + + } // anon namespace +} // namespace Catch + +#if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) +# ifdef CATCH_PLATFORM_WINDOWS +# define CATCH_CONFIG_COLOUR_WINDOWS +# else +# define CATCH_CONFIG_COLOUR_ANSI +# endif +#endif + +#if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// + +namespace Catch { +namespace { + + class Win32ColourImpl : public IColourImpl { + public: + Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) + { + CONSOLE_SCREEN_BUFFER_INFO csbiInfo; + GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); + originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); + originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); + } + + void use( Colour::Code _colourCode ) override { + switch( _colourCode ) { + case Colour::None: return setTextAttribute( originalForegroundAttributes ); + case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + case Colour::Red: return setTextAttribute( FOREGROUND_RED ); + case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); + case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); + case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); + case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); + case Colour::Grey: return setTextAttribute( 0 ); + + case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); + case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); + case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); + case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); + case Colour::BrightYellow: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN ); + + case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); + + default: + CATCH_ERROR( "Unknown colour requested" ); + } + } + + private: + void setTextAttribute( WORD _textAttribute ) { + SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); + } + HANDLE stdoutHandle; + WORD originalForegroundAttributes; + WORD originalBackgroundAttributes; + }; + + IColourImpl* platformColourInstance() { + static Win32ColourImpl s_instance; + + IConfigPtr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = UseColour::Yes; + return colourMode == UseColour::Yes + ? &s_instance + : NoColourImpl::instance(); + } + +} // end anon namespace +} // end namespace Catch + +#elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// + +#include <unistd.h> + +namespace Catch { +namespace { + + // use POSIX/ ANSI console terminal codes + // Thanks to Adam Strzelecki for original contribution + // (http://github.com/nanoant) + // https://github.com/philsquared/Catch/pull/131 + class PosixColourImpl : public IColourImpl { + public: + void use( Colour::Code _colourCode ) override { + switch( _colourCode ) { + case Colour::None: + case Colour::White: return setColour( "[0m" ); + case Colour::Red: return setColour( "[0;31m" ); + case Colour::Green: return setColour( "[0;32m" ); + case Colour::Blue: return setColour( "[0;34m" ); + case Colour::Cyan: return setColour( "[0;36m" ); + case Colour::Yellow: return setColour( "[0;33m" ); + case Colour::Grey: return setColour( "[1;30m" ); + + case Colour::LightGrey: return setColour( "[0;37m" ); + case Colour::BrightRed: return setColour( "[1;31m" ); + case Colour::BrightGreen: return setColour( "[1;32m" ); + case Colour::BrightWhite: return setColour( "[1;37m" ); + case Colour::BrightYellow: return setColour( "[1;33m" ); + + case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); + default: CATCH_INTERNAL_ERROR( "Unknown colour requested" ); + } + } + static IColourImpl* instance() { + static PosixColourImpl s_instance; + return &s_instance; + } + + private: + void setColour( const char* _escapeCode ) { + getCurrentContext().getConfig()->stream() + << '\033' << _escapeCode; + } + }; + + bool useColourOnPlatform() { + return +#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE) + !isDebuggerActive() && +#endif +#if !(defined(__DJGPP__) && defined(__STRICT_ANSI__)) + isatty(STDOUT_FILENO) +#else + false +#endif + ; + } + IColourImpl* platformColourInstance() { + ErrnoGuard guard; + IConfigPtr config = getCurrentContext().getConfig(); + UseColour::YesOrNo colourMode = config + ? config->useColour() + : UseColour::Auto; + if( colourMode == UseColour::Auto ) + colourMode = useColourOnPlatform() + ? UseColour::Yes + : UseColour::No; + return colourMode == UseColour::Yes + ? PosixColourImpl::instance() + : NoColourImpl::instance(); + } + +} // end anon namespace +} // end namespace Catch + +#else // not Windows or ANSI /////////////////////////////////////////////// + +namespace Catch { + + static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } + +} // end namespace Catch + +#endif // Windows/ ANSI/ None + +namespace Catch { + + Colour::Colour( Code _colourCode ) { use( _colourCode ); } + Colour::Colour( Colour&& other ) noexcept { + m_moved = other.m_moved; + other.m_moved = true; + } + Colour& Colour::operator=( Colour&& other ) noexcept { + m_moved = other.m_moved; + other.m_moved = true; + return *this; + } + + Colour::~Colour(){ if( !m_moved ) use( None ); } + + void Colour::use( Code _colourCode ) { + static IColourImpl* impl = platformColourInstance(); + // Strictly speaking, this cannot possibly happen. + // However, under some conditions it does happen (see #1626), + // and this change is small enough that we can let practicality + // triumph over purity in this case. + if (impl != nullptr) { + impl->use( _colourCode ); + } + } + + std::ostream& operator << ( std::ostream& os, Colour const& ) { + return os; + } + +} // end namespace Catch + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + +// end catch_console_colour.cpp +// start catch_context.cpp + +namespace Catch { + + class Context : public IMutableContext, NonCopyable { + + public: // IContext + IResultCapture* getResultCapture() override { + return m_resultCapture; + } + IRunner* getRunner() override { + return m_runner; + } + + IConfigPtr const& getConfig() const override { + return m_config; + } + + ~Context() override; + + public: // IMutableContext + void setResultCapture( IResultCapture* resultCapture ) override { + m_resultCapture = resultCapture; + } + void setRunner( IRunner* runner ) override { + m_runner = runner; + } + void setConfig( IConfigPtr const& config ) override { + m_config = config; + } + + friend IMutableContext& getCurrentMutableContext(); + + private: + IConfigPtr m_config; + IRunner* m_runner = nullptr; + IResultCapture* m_resultCapture = nullptr; + }; + + IMutableContext *IMutableContext::currentContext = nullptr; + + void IMutableContext::createContext() + { + currentContext = new Context(); + } + + void cleanUpContext() { + delete IMutableContext::currentContext; + IMutableContext::currentContext = nullptr; + } + IContext::~IContext() = default; + IMutableContext::~IMutableContext() = default; + Context::~Context() = default; + + SimplePcg32& rng() { + static SimplePcg32 s_rng; + return s_rng; + } + +} +// end catch_context.cpp +// start catch_debug_console.cpp + +// start catch_debug_console.h + +#include <string> + +namespace Catch { + void writeToDebugConsole( std::string const& text ); +} + +// end catch_debug_console.h +#if defined(CATCH_CONFIG_ANDROID_LOGWRITE) +#include <android/log.h> + + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + __android_log_write( ANDROID_LOG_DEBUG, "Catch", text.c_str() ); + } + } + +#elif defined(CATCH_PLATFORM_WINDOWS) + + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + ::OutputDebugStringA( text.c_str() ); + } + } + +#else + + namespace Catch { + void writeToDebugConsole( std::string const& text ) { + // !TBD: Need a version for Mac/ XCode and other IDEs + Catch::cout() << text; + } + } + +#endif // Platform +// end catch_debug_console.cpp +// start catch_debugger.cpp + +#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE) + +# include <cassert> +# include <sys/types.h> +# include <unistd.h> +# include <cstddef> +# include <ostream> + +#ifdef __apple_build_version__ + // These headers will only compile with AppleClang (XCode) + // For other compilers (Clang, GCC, ... ) we need to exclude them +# include <sys/sysctl.h> +#endif + + namespace Catch { + #ifdef __apple_build_version__ + // The following function is taken directly from the following technical note: + // https://developer.apple.com/library/archive/qa/qa1361/_index.html + + // Returns true if the current process is being debugged (either + // running under the debugger or has a debugger attached post facto). + bool isDebuggerActive(){ + int mib[4]; + struct kinfo_proc info; + std::size_t size; + + // Initialize the flags so that, if sysctl fails for some bizarre + // reason, we get a predictable result. + + info.kp_proc.p_flag = 0; + + // Initialize mib, which tells sysctl the info we want, in this case + // we're looking for information about a specific process ID. + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + // Call sysctl. + + size = sizeof(info); + if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0) != 0 ) { + Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; + return false; + } + + // We're being debugged if the P_TRACED flag is set. + + return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); + } + #else + bool isDebuggerActive() { + // We need to find another way to determine this for non-appleclang compilers on macOS + return false; + } + #endif + } // namespace Catch + +#elif defined(CATCH_PLATFORM_LINUX) + #include <fstream> + #include <string> + + namespace Catch{ + // The standard POSIX way of detecting a debugger is to attempt to + // ptrace() the process, but this needs to be done from a child and not + // this process itself to still allow attaching to this process later + // if wanted, so is rather heavy. Under Linux we have the PID of the + // "debugger" (which doesn't need to be gdb, of course, it could also + // be strace, for example) in /proc/$PID/status, so just get it from + // there instead. + bool isDebuggerActive(){ + // Libstdc++ has a bug, where std::ifstream sets errno to 0 + // This way our users can properly assert over errno values + ErrnoGuard guard; + std::ifstream in("/proc/self/status"); + for( std::string line; std::getline(in, line); ) { + static const int PREFIX_LEN = 11; + if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { + // We're traced if the PID is not 0 and no other PID starts + // with 0 digit, so it's enough to check for just a single + // character. + return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; + } + } + + return false; + } + } // namespace Catch +#elif defined(_MSC_VER) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#elif defined(__MINGW32__) + extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); + namespace Catch { + bool isDebuggerActive() { + return IsDebuggerPresent() != 0; + } + } +#else + namespace Catch { + bool isDebuggerActive() { return false; } + } +#endif // Platform +// end catch_debugger.cpp +// start catch_decomposer.cpp + +namespace Catch { + + ITransientExpression::~ITransientExpression() = default; + + void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ) { + if( lhs.size() + rhs.size() < 40 && + lhs.find('\n') == std::string::npos && + rhs.find('\n') == std::string::npos ) + os << lhs << " " << op << " " << rhs; + else + os << lhs << "\n" << op << "\n" << rhs; + } +} +// end catch_decomposer.cpp +// start catch_enforce.cpp + +#include <stdexcept> + +namespace Catch { +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS_CUSTOM_HANDLER) + [[noreturn]] + void throw_exception(std::exception const& e) { + Catch::cerr() << "Catch will terminate because it needed to throw an exception.\n" + << "The message was: " << e.what() << '\n'; + std::terminate(); + } +#endif + + [[noreturn]] + void throw_logic_error(std::string const& msg) { + throw_exception(std::logic_error(msg)); + } + + [[noreturn]] + void throw_domain_error(std::string const& msg) { + throw_exception(std::domain_error(msg)); + } + + [[noreturn]] + void throw_runtime_error(std::string const& msg) { + throw_exception(std::runtime_error(msg)); + } + +} // namespace Catch; +// end catch_enforce.cpp +// start catch_enum_values_registry.cpp +// start catch_enum_values_registry.h + +#include <vector> +#include <memory> + +namespace Catch { + + namespace Detail { + + std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ); + + class EnumValuesRegistry : public IMutableEnumValuesRegistry { + + std::vector<std::unique_ptr<EnumInfo>> m_enumInfos; + + EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values) override; + }; + + std::vector<StringRef> parseEnums( StringRef enums ); + + } // Detail + +} // Catch + +// end catch_enum_values_registry.h + +#include <map> +#include <cassert> + +namespace Catch { + + IMutableEnumValuesRegistry::~IMutableEnumValuesRegistry() {} + + namespace Detail { + + namespace { + // Extracts the actual name part of an enum instance + // In other words, it returns the Blue part of Bikeshed::Colour::Blue + StringRef extractInstanceName(StringRef enumInstance) { + // Find last occurence of ":" + size_t name_start = enumInstance.size(); + while (name_start > 0 && enumInstance[name_start - 1] != ':') { + --name_start; + } + return enumInstance.substr(name_start, enumInstance.size() - name_start); + } + } + + std::vector<StringRef> parseEnums( StringRef enums ) { + auto enumValues = splitStringRef( enums, ',' ); + std::vector<StringRef> parsed; + parsed.reserve( enumValues.size() ); + for( auto const& enumValue : enumValues ) { + parsed.push_back(trim(extractInstanceName(enumValue))); + } + return parsed; + } + + EnumInfo::~EnumInfo() {} + + StringRef EnumInfo::lookup( int value ) const { + for( auto const& valueToName : m_values ) { + if( valueToName.first == value ) + return valueToName.second; + } + return "{** unexpected enum value **}"_sr; + } + + std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { + std::unique_ptr<EnumInfo> enumInfo( new EnumInfo ); + enumInfo->m_name = enumName; + enumInfo->m_values.reserve( values.size() ); + + const auto valueNames = Catch::Detail::parseEnums( allValueNames ); + assert( valueNames.size() == values.size() ); + std::size_t i = 0; + for( auto value : values ) + enumInfo->m_values.emplace_back(value, valueNames[i++]); + + return enumInfo; + } + + EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) { + m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values)); + return *m_enumInfos.back(); + } + + } // Detail +} // Catch + +// end catch_enum_values_registry.cpp +// start catch_errno_guard.cpp + +#include <cerrno> + +namespace Catch { + ErrnoGuard::ErrnoGuard():m_oldErrno(errno){} + ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; } +} +// end catch_errno_guard.cpp +// start catch_exception_translator_registry.cpp + +// start catch_exception_translator_registry.h + +#include <vector> +#include <string> +#include <memory> + +namespace Catch { + + class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { + public: + ~ExceptionTranslatorRegistry(); + virtual void registerTranslator( const IExceptionTranslator* translator ); + std::string translateActiveException() const override; + std::string tryTranslators() const; + + private: + std::vector<std::unique_ptr<IExceptionTranslator const>> m_translators; + }; +} + +// end catch_exception_translator_registry.h +#ifdef __OBJC__ +#import "Foundation/Foundation.h" +#endif + +namespace Catch { + + ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() { + } + + void ExceptionTranslatorRegistry::registerTranslator( const IExceptionTranslator* translator ) { + m_translators.push_back( std::unique_ptr<const IExceptionTranslator>( translator ) ); + } + +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + std::string ExceptionTranslatorRegistry::translateActiveException() const { + try { +#ifdef __OBJC__ + // In Objective-C try objective-c exceptions first + @try { + return tryTranslators(); + } + @catch (NSException *exception) { + return Catch::Detail::stringify( [exception description] ); + } +#else + // Compiling a mixed mode project with MSVC means that CLR + // exceptions will be caught in (...) as well. However, these + // do not fill-in std::current_exception and thus lead to crash + // when attempting rethrow. + // /EHa switch also causes structured exceptions to be caught + // here, but they fill-in current_exception properly, so + // at worst the output should be a little weird, instead of + // causing a crash. + if (std::current_exception() == nullptr) { + return "Non C++ exception. Possibly a CLR exception."; + } + return tryTranslators(); +#endif + } + catch( TestFailureException& ) { + std::rethrow_exception(std::current_exception()); + } + catch( std::exception& ex ) { + return ex.what(); + } + catch( std::string& msg ) { + return msg; + } + catch( const char* msg ) { + return msg; + } + catch(...) { + return "Unknown exception"; + } + } + + std::string ExceptionTranslatorRegistry::tryTranslators() const { + if (m_translators.empty()) { + std::rethrow_exception(std::current_exception()); + } else { + return m_translators[0]->translate(m_translators.begin() + 1, m_translators.end()); + } + } + +#else // ^^ Exceptions are enabled // Exceptions are disabled vv + std::string ExceptionTranslatorRegistry::translateActiveException() const { + CATCH_INTERNAL_ERROR("Attempted to translate active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!"); + } + + std::string ExceptionTranslatorRegistry::tryTranslators() const { + CATCH_INTERNAL_ERROR("Attempted to use exception translators under CATCH_CONFIG_DISABLE_EXCEPTIONS!"); + } +#endif + +} +// end catch_exception_translator_registry.cpp +// start catch_fatal_condition.cpp + +#if defined(__GNUC__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif + +#if defined( CATCH_CONFIG_WINDOWS_SEH ) || defined( CATCH_CONFIG_POSIX_SIGNALS ) + +namespace { + // Report the error condition + void reportFatal( char const * const message ) { + Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition( message ); + } +} + +#endif // signals/SEH handling + +#if defined( CATCH_CONFIG_WINDOWS_SEH ) + +namespace Catch { + struct SignalDefs { DWORD id; const char* name; }; + + // There is no 1-1 mapping between signals and windows exceptions. + // Windows can easily distinguish between SO and SigSegV, + // but SigInt, SigTerm, etc are handled differently. + static SignalDefs signalDefs[] = { + { static_cast<DWORD>(EXCEPTION_ILLEGAL_INSTRUCTION), "SIGILL - Illegal instruction signal" }, + { static_cast<DWORD>(EXCEPTION_STACK_OVERFLOW), "SIGSEGV - Stack overflow" }, + { static_cast<DWORD>(EXCEPTION_ACCESS_VIOLATION), "SIGSEGV - Segmentation violation signal" }, + { static_cast<DWORD>(EXCEPTION_INT_DIVIDE_BY_ZERO), "Divide by zero error" }, + }; + + LONG CALLBACK FatalConditionHandler::handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { + for (auto const& def : signalDefs) { + if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) { + reportFatal(def.name); + } + } + // If its not an exception we care about, pass it along. + // This stops us from eating debugger breaks etc. + return EXCEPTION_CONTINUE_SEARCH; + } + + FatalConditionHandler::FatalConditionHandler() { + isSet = true; + // 32k seems enough for Catch to handle stack overflow, + // but the value was found experimentally, so there is no strong guarantee + guaranteeSize = 32 * 1024; + exceptionHandlerHandle = nullptr; + // Register as first handler in current chain + exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); + // Pass in guarantee size to be filled + SetThreadStackGuarantee(&guaranteeSize); + } + + void FatalConditionHandler::reset() { + if (isSet) { + RemoveVectoredExceptionHandler(exceptionHandlerHandle); + SetThreadStackGuarantee(&guaranteeSize); + exceptionHandlerHandle = nullptr; + isSet = false; + } + } + + FatalConditionHandler::~FatalConditionHandler() { + reset(); + } + +bool FatalConditionHandler::isSet = false; +ULONG FatalConditionHandler::guaranteeSize = 0; +PVOID FatalConditionHandler::exceptionHandlerHandle = nullptr; + +} // namespace Catch + +#elif defined( CATCH_CONFIG_POSIX_SIGNALS ) + +namespace Catch { + + struct SignalDefs { + int id; + const char* name; + }; + + // 32kb for the alternate stack seems to be sufficient. However, this value + // is experimentally determined, so that's not guaranteed. + static constexpr std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ; + + static SignalDefs signalDefs[] = { + { SIGINT, "SIGINT - Terminal interrupt signal" }, + { SIGILL, "SIGILL - Illegal instruction signal" }, + { SIGFPE, "SIGFPE - Floating point error signal" }, + { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, + { SIGTERM, "SIGTERM - Termination request signal" }, + { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } + }; + + void FatalConditionHandler::handleSignal( int sig ) { + char const * name = "<unknown signal>"; + for (auto const& def : signalDefs) { + if (sig == def.id) { + name = def.name; + break; + } + } + reset(); + reportFatal(name); + raise( sig ); + } + + FatalConditionHandler::FatalConditionHandler() { + isSet = true; + stack_t sigStack; + sigStack.ss_sp = altStackMem; + sigStack.ss_size = sigStackSize; + sigStack.ss_flags = 0; + sigaltstack(&sigStack, &oldSigStack); + struct sigaction sa = { }; + + sa.sa_handler = handleSignal; + sa.sa_flags = SA_ONSTACK; + for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) { + sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); + } + } + + FatalConditionHandler::~FatalConditionHandler() { + reset(); + } + + void FatalConditionHandler::reset() { + if( isSet ) { + // Set signals back to previous values -- hopefully nobody overwrote them in the meantime + for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) { + sigaction(signalDefs[i].id, &oldSigActions[i], nullptr); + } + // Return the old stack + sigaltstack(&oldSigStack, nullptr); + isSet = false; + } + } + + bool FatalConditionHandler::isSet = false; + struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; + stack_t FatalConditionHandler::oldSigStack = {}; + char FatalConditionHandler::altStackMem[sigStackSize] = {}; + +} // namespace Catch + +#else + +namespace Catch { + void FatalConditionHandler::reset() {} +} + +#endif // signals/SEH handling + +#if defined(__GNUC__) +# pragma GCC diagnostic pop +#endif +// end catch_fatal_condition.cpp +// start catch_generators.cpp + +#include <limits> +#include <set> + +namespace Catch { + +IGeneratorTracker::~IGeneratorTracker() {} + +const char* GeneratorException::what() const noexcept { + return m_msg; +} + +namespace Generators { + + GeneratorUntypedBase::~GeneratorUntypedBase() {} + + auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + return getResultCapture().acquireGeneratorTracker( generatorName, lineInfo ); + } + +} // namespace Generators +} // namespace Catch +// end catch_generators.cpp +// start catch_interfaces_capture.cpp + +namespace Catch { + IResultCapture::~IResultCapture() = default; +} +// end catch_interfaces_capture.cpp +// start catch_interfaces_config.cpp + +namespace Catch { + IConfig::~IConfig() = default; +} +// end catch_interfaces_config.cpp +// start catch_interfaces_exception.cpp + +namespace Catch { + IExceptionTranslator::~IExceptionTranslator() = default; + IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default; +} +// end catch_interfaces_exception.cpp +// start catch_interfaces_registry_hub.cpp + +namespace Catch { + IRegistryHub::~IRegistryHub() = default; + IMutableRegistryHub::~IMutableRegistryHub() = default; +} +// end catch_interfaces_registry_hub.cpp +// start catch_interfaces_reporter.cpp + +// start catch_reporter_listening.h + +namespace Catch { + + class ListeningReporter : public IStreamingReporter { + using Reporters = std::vector<IStreamingReporterPtr>; + Reporters m_listeners; + IStreamingReporterPtr m_reporter = nullptr; + ReporterPreferences m_preferences; + + public: + ListeningReporter(); + + void addListener( IStreamingReporterPtr&& listener ); + void addReporter( IStreamingReporterPtr&& reporter ); + + public: // IStreamingReporter + + ReporterPreferences getPreferences() const override; + + void noMatchingTestCases( std::string const& spec ) override; + + void reportInvalidArguments(std::string const&arg) override; + + static std::set<Verbosity> getSupportedVerbosities(); + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void benchmarkPreparing(std::string const& name) override; + void benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) override; + void benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) override; + void benchmarkFailed(std::string const&) override; +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void testRunStarting( TestRunInfo const& testRunInfo ) override; + void testGroupStarting( GroupInfo const& groupInfo ) override; + void testCaseStarting( TestCaseInfo const& testInfo ) override; + void sectionStarting( SectionInfo const& sectionInfo ) override; + void assertionStarting( AssertionInfo const& assertionInfo ) override; + + // The return value indicates if the messages buffer should be cleared: + bool assertionEnded( AssertionStats const& assertionStats ) override; + void sectionEnded( SectionStats const& sectionStats ) override; + void testCaseEnded( TestCaseStats const& testCaseStats ) override; + void testGroupEnded( TestGroupStats const& testGroupStats ) override; + void testRunEnded( TestRunStats const& testRunStats ) override; + + void skipTest( TestCaseInfo const& testInfo ) override; + bool isMulti() const override; + + }; + +} // end namespace Catch + +// end catch_reporter_listening.h +namespace Catch { + + ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig ) + : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} + + ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream ) + : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} + + std::ostream& ReporterConfig::stream() const { return *m_stream; } + IConfigPtr ReporterConfig::fullConfig() const { return m_fullConfig; } + + TestRunInfo::TestRunInfo( std::string const& _name ) : name( _name ) {} + + GroupInfo::GroupInfo( std::string const& _name, + std::size_t _groupIndex, + std::size_t _groupsCount ) + : name( _name ), + groupIndex( _groupIndex ), + groupsCounts( _groupsCount ) + {} + + AssertionStats::AssertionStats( AssertionResult const& _assertionResult, + std::vector<MessageInfo> const& _infoMessages, + Totals const& _totals ) + : assertionResult( _assertionResult ), + infoMessages( _infoMessages ), + totals( _totals ) + { + assertionResult.m_resultData.lazyExpression.m_transientExpression = _assertionResult.m_resultData.lazyExpression.m_transientExpression; + + if( assertionResult.hasMessage() ) { + // Copy message into messages list. + // !TBD This should have been done earlier, somewhere + MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); + builder << assertionResult.getMessage(); + builder.m_info.message = builder.m_stream.str(); + + infoMessages.push_back( builder.m_info ); + } + } + + AssertionStats::~AssertionStats() = default; + + SectionStats::SectionStats( SectionInfo const& _sectionInfo, + Counts const& _assertions, + double _durationInSeconds, + bool _missingAssertions ) + : sectionInfo( _sectionInfo ), + assertions( _assertions ), + durationInSeconds( _durationInSeconds ), + missingAssertions( _missingAssertions ) + {} + + SectionStats::~SectionStats() = default; + + TestCaseStats::TestCaseStats( TestCaseInfo const& _testInfo, + Totals const& _totals, + std::string const& _stdOut, + std::string const& _stdErr, + bool _aborting ) + : testInfo( _testInfo ), + totals( _totals ), + stdOut( _stdOut ), + stdErr( _stdErr ), + aborting( _aborting ) + {} + + TestCaseStats::~TestCaseStats() = default; + + TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo, + Totals const& _totals, + bool _aborting ) + : groupInfo( _groupInfo ), + totals( _totals ), + aborting( _aborting ) + {} + + TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo ) + : groupInfo( _groupInfo ), + aborting( false ) + {} + + TestGroupStats::~TestGroupStats() = default; + + TestRunStats::TestRunStats( TestRunInfo const& _runInfo, + Totals const& _totals, + bool _aborting ) + : runInfo( _runInfo ), + totals( _totals ), + aborting( _aborting ) + {} + + TestRunStats::~TestRunStats() = default; + + void IStreamingReporter::fatalErrorEncountered( StringRef ) {} + bool IStreamingReporter::isMulti() const { return false; } + + IReporterFactory::~IReporterFactory() = default; + IReporterRegistry::~IReporterRegistry() = default; + +} // end namespace Catch +// end catch_interfaces_reporter.cpp +// start catch_interfaces_runner.cpp + +namespace Catch { + IRunner::~IRunner() = default; +} +// end catch_interfaces_runner.cpp +// start catch_interfaces_testcase.cpp + +namespace Catch { + ITestInvoker::~ITestInvoker() = default; + ITestCaseRegistry::~ITestCaseRegistry() = default; +} +// end catch_interfaces_testcase.cpp +// start catch_leak_detector.cpp + +#ifdef CATCH_CONFIG_WINDOWS_CRTDBG +#include <crtdbg.h> + +namespace Catch { + + LeakDetector::LeakDetector() { + int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); + flag |= _CRTDBG_LEAK_CHECK_DF; + flag |= _CRTDBG_ALLOC_MEM_DF; + _CrtSetDbgFlag(flag); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); + _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); + // Change this to leaking allocation's number to break there + _CrtSetBreakAlloc(-1); + } +} + +#else + + Catch::LeakDetector::LeakDetector() {} + +#endif + +Catch::LeakDetector::~LeakDetector() { + Catch::cleanUp(); +} +// end catch_leak_detector.cpp +// start catch_list.cpp + +// start catch_list.h + +#include <set> + +namespace Catch { + + std::size_t listTests( Config const& config ); + + std::size_t listTestsNamesOnly( Config const& config ); + + struct TagInfo { + void add( std::string const& spelling ); + std::string all() const; + + std::set<std::string> spellings; + std::size_t count = 0; + }; + + std::size_t listTags( Config const& config ); + + std::size_t listReporters(); + + Option<std::size_t> list( std::shared_ptr<Config> const& config ); + +} // end namespace Catch + +// end catch_list.h +// start catch_text.h + +namespace Catch { + using namespace clara::TextFlow; +} + +// end catch_text.h +#include <limits> +#include <algorithm> +#include <iomanip> + +namespace Catch { + + std::size_t listTests( Config const& config ) { + TestSpec const& testSpec = config.testSpec(); + if( config.hasTestFilters() ) + Catch::cout() << "Matching test cases:\n"; + else { + Catch::cout() << "All available test cases:\n"; + } + + auto matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( auto const& testCaseInfo : matchedTestCases ) { + Colour::Code colour = testCaseInfo.isHidden() + ? Colour::SecondaryText + : Colour::None; + Colour colourGuard( colour ); + + Catch::cout() << Column( testCaseInfo.name ).initialIndent( 2 ).indent( 4 ) << "\n"; + if( config.verbosity() >= Verbosity::High ) { + Catch::cout() << Column( Catch::Detail::stringify( testCaseInfo.lineInfo ) ).indent(4) << std::endl; + std::string description = testCaseInfo.description; + if( description.empty() ) + description = "(NO DESCRIPTION)"; + Catch::cout() << Column( description ).indent(4) << std::endl; + } + if( !testCaseInfo.tags.empty() ) + Catch::cout() << Column( testCaseInfo.tagsAsString() ).indent( 6 ) << "\n"; + } + + if( !config.hasTestFilters() ) + Catch::cout() << pluralise( matchedTestCases.size(), "test case" ) << '\n' << std::endl; + else + Catch::cout() << pluralise( matchedTestCases.size(), "matching test case" ) << '\n' << std::endl; + return matchedTestCases.size(); + } + + std::size_t listTestsNamesOnly( Config const& config ) { + TestSpec const& testSpec = config.testSpec(); + std::size_t matchedTests = 0; + std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( auto const& testCaseInfo : matchedTestCases ) { + matchedTests++; + if( startsWith( testCaseInfo.name, '#' ) ) + Catch::cout() << '"' << testCaseInfo.name << '"'; + else + Catch::cout() << testCaseInfo.name; + if ( config.verbosity() >= Verbosity::High ) + Catch::cout() << "\t@" << testCaseInfo.lineInfo; + Catch::cout() << std::endl; + } + return matchedTests; + } + + void TagInfo::add( std::string const& spelling ) { + ++count; + spellings.insert( spelling ); + } + + std::string TagInfo::all() const { + size_t size = 0; + for (auto const& spelling : spellings) { + // Add 2 for the brackes + size += spelling.size() + 2; + } + + std::string out; out.reserve(size); + for (auto const& spelling : spellings) { + out += '['; + out += spelling; + out += ']'; + } + return out; + } + + std::size_t listTags( Config const& config ) { + TestSpec const& testSpec = config.testSpec(); + if( config.hasTestFilters() ) + Catch::cout() << "Tags for matching test cases:\n"; + else { + Catch::cout() << "All available tags:\n"; + } + + std::map<std::string, TagInfo> tagCounts; + + std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); + for( auto const& testCase : matchedTestCases ) { + for( auto const& tagName : testCase.getTestCaseInfo().tags ) { + std::string lcaseTagName = toLower( tagName ); + auto countIt = tagCounts.find( lcaseTagName ); + if( countIt == tagCounts.end() ) + countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; + countIt->second.add( tagName ); + } + } + + for( auto const& tagCount : tagCounts ) { + ReusableStringStream rss; + rss << " " << std::setw(2) << tagCount.second.count << " "; + auto str = rss.str(); + auto wrapper = Column( tagCount.second.all() ) + .initialIndent( 0 ) + .indent( str.size() ) + .width( CATCH_CONFIG_CONSOLE_WIDTH-10 ); + Catch::cout() << str << wrapper << '\n'; + } + Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; + return tagCounts.size(); + } + + std::size_t listReporters() { + Catch::cout() << "Available reporters:\n"; + IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); + std::size_t maxNameLen = 0; + for( auto const& factoryKvp : factories ) + maxNameLen = (std::max)( maxNameLen, factoryKvp.first.size() ); + + for( auto const& factoryKvp : factories ) { + Catch::cout() + << Column( factoryKvp.first + ":" ) + .indent(2) + .width( 5+maxNameLen ) + + Column( factoryKvp.second->getDescription() ) + .initialIndent(0) + .indent(2) + .width( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) + << "\n"; + } + Catch::cout() << std::endl; + return factories.size(); + } + + Option<std::size_t> list( std::shared_ptr<Config> const& config ) { + Option<std::size_t> listedCount; + getCurrentMutableContext().setConfig( config ); + if( config->listTests() ) + listedCount = listedCount.valueOr(0) + listTests( *config ); + if( config->listTestNamesOnly() ) + listedCount = listedCount.valueOr(0) + listTestsNamesOnly( *config ); + if( config->listTags() ) + listedCount = listedCount.valueOr(0) + listTags( *config ); + if( config->listReporters() ) + listedCount = listedCount.valueOr(0) + listReporters(); + return listedCount; + } + +} // end namespace Catch +// end catch_list.cpp +// start catch_matchers.cpp + +namespace Catch { +namespace Matchers { + namespace Impl { + + std::string MatcherUntypedBase::toString() const { + if( m_cachedToString.empty() ) + m_cachedToString = describe(); + return m_cachedToString; + } + + MatcherUntypedBase::~MatcherUntypedBase() = default; + + } // namespace Impl +} // namespace Matchers + +using namespace Matchers; +using Matchers::Impl::MatcherBase; + +} // namespace Catch +// end catch_matchers.cpp +// start catch_matchers_exception.cpp + +namespace Catch { +namespace Matchers { +namespace Exception { + +bool ExceptionMessageMatcher::match(std::exception const& ex) const { + return ex.what() == m_message; +} + +std::string ExceptionMessageMatcher::describe() const { + return "exception message matches \"" + m_message + "\""; +} + +} +Exception::ExceptionMessageMatcher Message(std::string const& message) { + return Exception::ExceptionMessageMatcher(message); +} + +// namespace Exception +} // namespace Matchers +} // namespace Catch +// end catch_matchers_exception.cpp +// start catch_matchers_floating.cpp + +// start catch_polyfills.hpp + +namespace Catch { + bool isnan(float f); + bool isnan(double d); +} + +// end catch_polyfills.hpp +// start catch_to_string.hpp + +#include <string> + +namespace Catch { + template <typename T> + std::string to_string(T const& t) { +#if defined(CATCH_CONFIG_CPP11_TO_STRING) + return std::to_string(t); +#else + ReusableStringStream rss; + rss << t; + return rss.str(); +#endif + } +} // end namespace Catch + +// end catch_to_string.hpp +#include <algorithm> +#include <cmath> +#include <cstdlib> +#include <cstdint> +#include <cstring> +#include <sstream> +#include <type_traits> +#include <iomanip> +#include <limits> + +namespace Catch { +namespace { + + int32_t convert(float f) { + static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated"); + int32_t i; + std::memcpy(&i, &f, sizeof(f)); + return i; + } + + int64_t convert(double d) { + static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated"); + int64_t i; + std::memcpy(&i, &d, sizeof(d)); + return i; + } + + template <typename FP> + bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) { + // Comparison with NaN should always be false. + // This way we can rule it out before getting into the ugly details + if (Catch::isnan(lhs) || Catch::isnan(rhs)) { + return false; + } + + auto lc = convert(lhs); + auto rc = convert(rhs); + + if ((lc < 0) != (rc < 0)) { + // Potentially we can have +0 and -0 + return lhs == rhs; + } + + auto ulpDiff = std::abs(lc - rc); + return static_cast<uint64_t>(ulpDiff) <= maxUlpDiff; + } + +#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) + + float nextafter(float x, float y) { + return ::nextafterf(x, y); + } + + double nextafter(double x, double y) { + return ::nextafter(x, y); + } + +#endif // ^^^ CATCH_CONFIG_GLOBAL_NEXTAFTER ^^^ + +template <typename FP> +FP step(FP start, FP direction, uint64_t steps) { + for (uint64_t i = 0; i < steps; ++i) { +#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) + start = Catch::nextafter(start, direction); +#else + start = std::nextafter(start, direction); +#endif + } + return start; +} + +// Performs equivalent check of std::fabs(lhs - rhs) <= margin +// But without the subtraction to allow for INFINITY in comparison +bool marginComparison(double lhs, double rhs, double margin) { + return (lhs + margin >= rhs) && (rhs + margin >= lhs); +} + +template <typename FloatingPoint> +void write(std::ostream& out, FloatingPoint num) { + out << std::scientific + << std::setprecision(std::numeric_limits<FloatingPoint>::max_digits10 - 1) + << num; +} + +} // end anonymous namespace + +namespace Matchers { +namespace Floating { + + enum class FloatingPointKind : uint8_t { + Float, + Double + }; + + WithinAbsMatcher::WithinAbsMatcher(double target, double margin) + :m_target{ target }, m_margin{ margin } { + CATCH_ENFORCE(margin >= 0, "Invalid margin: " << margin << '.' + << " Margin has to be non-negative."); + } + + // Performs equivalent check of std::fabs(lhs - rhs) <= margin + // But without the subtraction to allow for INFINITY in comparison + bool WithinAbsMatcher::match(double const& matchee) const { + return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee); + } + + std::string WithinAbsMatcher::describe() const { + return "is within " + ::Catch::Detail::stringify(m_margin) + " of " + ::Catch::Detail::stringify(m_target); + } + + WithinUlpsMatcher::WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType) + :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } { + CATCH_ENFORCE(m_type == FloatingPointKind::Double + || m_ulps < (std::numeric_limits<uint32_t>::max)(), + "Provided ULP is impossibly large for a float comparison."); + } + +#if defined(__clang__) +#pragma clang diagnostic push +// Clang <3.5 reports on the default branch in the switch below +#pragma clang diagnostic ignored "-Wunreachable-code" +#endif + + bool WithinUlpsMatcher::match(double const& matchee) const { + switch (m_type) { + case FloatingPointKind::Float: + return almostEqualUlps<float>(static_cast<float>(matchee), static_cast<float>(m_target), m_ulps); + case FloatingPointKind::Double: + return almostEqualUlps<double>(matchee, m_target, m_ulps); + default: + CATCH_INTERNAL_ERROR( "Unknown FloatingPointKind value" ); + } + } + +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + + std::string WithinUlpsMatcher::describe() const { + std::stringstream ret; + + ret << "is within " << m_ulps << " ULPs of "; + + if (m_type == FloatingPointKind::Float) { + write(ret, static_cast<float>(m_target)); + ret << 'f'; + } else { + write(ret, m_target); + } + + ret << " (["; + if (m_type == FloatingPointKind::Double) { + write(ret, step(m_target, static_cast<double>(-INFINITY), m_ulps)); + ret << ", "; + write(ret, step(m_target, static_cast<double>( INFINITY), m_ulps)); + } else { + // We have to cast INFINITY to float because of MinGW, see #1782 + write(ret, step(static_cast<float>(m_target), static_cast<float>(-INFINITY), m_ulps)); + ret << ", "; + write(ret, step(static_cast<float>(m_target), static_cast<float>( INFINITY), m_ulps)); + } + ret << "])"; + + return ret.str(); + } + + WithinRelMatcher::WithinRelMatcher(double target, double epsilon): + m_target(target), + m_epsilon(epsilon){ + CATCH_ENFORCE(m_epsilon >= 0., "Relative comparison with epsilon < 0 does not make sense."); + CATCH_ENFORCE(m_epsilon < 1., "Relative comparison with epsilon >= 1 does not make sense."); + } + + bool WithinRelMatcher::match(double const& matchee) const { + const auto relMargin = m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target)); + return marginComparison(matchee, m_target, + std::isinf(relMargin)? 0 : relMargin); + } + + std::string WithinRelMatcher::describe() const { + Catch::ReusableStringStream sstr; + sstr << "and " << m_target << " are within " << m_epsilon * 100. << "% of each other"; + return sstr.str(); + } + +}// namespace Floating + +Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) { + return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double); +} + +Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) { + return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float); +} + +Floating::WithinAbsMatcher WithinAbs(double target, double margin) { + return Floating::WithinAbsMatcher(target, margin); +} + +Floating::WithinRelMatcher WithinRel(double target, double eps) { + return Floating::WithinRelMatcher(target, eps); +} + +Floating::WithinRelMatcher WithinRel(double target) { + return Floating::WithinRelMatcher(target, std::numeric_limits<double>::epsilon() * 100); +} + +Floating::WithinRelMatcher WithinRel(float target, float eps) { + return Floating::WithinRelMatcher(target, eps); +} + +Floating::WithinRelMatcher WithinRel(float target) { + return Floating::WithinRelMatcher(target, std::numeric_limits<float>::epsilon() * 100); +} + +} // namespace Matchers +} // namespace Catch + +// end catch_matchers_floating.cpp +// start catch_matchers_generic.cpp + +std::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::string& desc) { + if (desc.empty()) { + return "matches undescribed predicate"; + } else { + return "matches predicate: \"" + desc + '"'; + } +} +// end catch_matchers_generic.cpp +// start catch_matchers_string.cpp + +#include <regex> + +namespace Catch { +namespace Matchers { + + namespace StdString { + + CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_str( adjustString( str ) ) + {} + std::string CasedString::adjustString( std::string const& str ) const { + return m_caseSensitivity == CaseSensitive::No + ? toLower( str ) + : str; + } + std::string CasedString::caseSensitivitySuffix() const { + return m_caseSensitivity == CaseSensitive::No + ? " (case insensitive)" + : std::string(); + } + + StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) + : m_comparator( comparator ), + m_operation( operation ) { + } + + std::string StringMatcherBase::describe() const { + std::string description; + description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + + m_comparator.caseSensitivitySuffix().size()); + description += m_operation; + description += ": \""; + description += m_comparator.m_str; + description += "\""; + description += m_comparator.caseSensitivitySuffix(); + return description; + } + + EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} + + bool EqualsMatcher::match( std::string const& source ) const { + return m_comparator.adjustString( source ) == m_comparator.m_str; + } + + ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} + + bool ContainsMatcher::match( std::string const& source ) const { + return contains( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} + + bool StartsWithMatcher::match( std::string const& source ) const { + return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} + + bool EndsWithMatcher::match( std::string const& source ) const { + return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); + } + + RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity): m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {} + + bool RegexMatcher::match(std::string const& matchee) const { + auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax option anyway + if (m_caseSensitivity == CaseSensitive::Choice::No) { + flags |= std::regex::icase; + } + auto reg = std::regex(m_regex, flags); + return std::regex_match(matchee, reg); + } + + std::string RegexMatcher::describe() const { + return "matches " + ::Catch::Detail::stringify(m_regex) + ((m_caseSensitivity == CaseSensitive::Choice::Yes)? " case sensitively" : " case insensitively"); + } + + } // namespace StdString + + StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { + return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); + } + + StdString::RegexMatcher Matches(std::string const& regex, CaseSensitive::Choice caseSensitivity) { + return StdString::RegexMatcher(regex, caseSensitivity); + } + +} // namespace Matchers +} // namespace Catch +// end catch_matchers_string.cpp +// start catch_message.cpp + +// start catch_uncaught_exceptions.h + +namespace Catch { + bool uncaught_exceptions(); +} // end namespace Catch + +// end catch_uncaught_exceptions.h +#include <cassert> +#include <stack> + +namespace Catch { + + MessageInfo::MessageInfo( StringRef const& _macroName, + SourceLineInfo const& _lineInfo, + ResultWas::OfType _type ) + : macroName( _macroName ), + lineInfo( _lineInfo ), + type( _type ), + sequence( ++globalCount ) + {} + + bool MessageInfo::operator==( MessageInfo const& other ) const { + return sequence == other.sequence; + } + + bool MessageInfo::operator<( MessageInfo const& other ) const { + return sequence < other.sequence; + } + + // This may need protecting if threading support is added + unsigned int MessageInfo::globalCount = 0; + + //////////////////////////////////////////////////////////////////////////// + + Catch::MessageBuilder::MessageBuilder( StringRef const& macroName, + SourceLineInfo const& lineInfo, + ResultWas::OfType type ) + :m_info(macroName, lineInfo, type) {} + + //////////////////////////////////////////////////////////////////////////// + + ScopedMessage::ScopedMessage( MessageBuilder const& builder ) + : m_info( builder.m_info ), m_moved() + { + m_info.message = builder.m_stream.str(); + getResultCapture().pushScopedMessage( m_info ); + } + + ScopedMessage::ScopedMessage( ScopedMessage&& old ) + : m_info( old.m_info ), m_moved() + { + old.m_moved = true; + } + + ScopedMessage::~ScopedMessage() { + if ( !uncaught_exceptions() && !m_moved ){ + getResultCapture().popScopedMessage(m_info); + } + } + + Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) { + auto trimmed = [&] (size_t start, size_t end) { + while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) { + ++start; + } + while (names[end] == ',' || isspace(static_cast<unsigned char>(names[end]))) { + --end; + } + return names.substr(start, end - start + 1); + }; + auto skipq = [&] (size_t start, char quote) { + for (auto i = start + 1; i < names.size() ; ++i) { + if (names[i] == quote) + return i; + if (names[i] == '\\') + ++i; + } + CATCH_INTERNAL_ERROR("CAPTURE parsing encountered unmatched quote"); + }; + + size_t start = 0; + std::stack<char> openings; + for (size_t pos = 0; pos < names.size(); ++pos) { + char c = names[pos]; + switch (c) { + case '[': + case '{': + case '(': + // It is basically impossible to disambiguate between + // comparison and start of template args in this context +// case '<': + openings.push(c); + break; + case ']': + case '}': + case ')': +// case '>': + openings.pop(); + break; + case '"': + case '\'': + pos = skipq(pos, c); + break; + case ',': + if (start != pos && openings.empty()) { + m_messages.emplace_back(macroName, lineInfo, resultType); + m_messages.back().message = static_cast<std::string>(trimmed(start, pos)); + m_messages.back().message += " := "; + start = pos; + } + } + } + assert(openings.empty() && "Mismatched openings"); + m_messages.emplace_back(macroName, lineInfo, resultType); + m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1)); + m_messages.back().message += " := "; + } + Capturer::~Capturer() { + if ( !uncaught_exceptions() ){ + assert( m_captured == m_messages.size() ); + for( size_t i = 0; i < m_captured; ++i ) + m_resultCapture.popScopedMessage( m_messages[i] ); + } + } + + void Capturer::captureValue( size_t index, std::string const& value ) { + assert( index < m_messages.size() ); + m_messages[index].message += value; + m_resultCapture.pushScopedMessage( m_messages[index] ); + m_captured++; + } + +} // end namespace Catch +// end catch_message.cpp +// start catch_output_redirect.cpp + +// start catch_output_redirect.h +#ifndef TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H +#define TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H + +#include <cstdio> +#include <iosfwd> +#include <string> + +namespace Catch { + + class RedirectedStream { + std::ostream& m_originalStream; + std::ostream& m_redirectionStream; + std::streambuf* m_prevBuf; + + public: + RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream ); + ~RedirectedStream(); + }; + + class RedirectedStdOut { + ReusableStringStream m_rss; + RedirectedStream m_cout; + public: + RedirectedStdOut(); + auto str() const -> std::string; + }; + + // StdErr has two constituent streams in C++, std::cerr and std::clog + // This means that we need to redirect 2 streams into 1 to keep proper + // order of writes + class RedirectedStdErr { + ReusableStringStream m_rss; + RedirectedStream m_cerr; + RedirectedStream m_clog; + public: + RedirectedStdErr(); + auto str() const -> std::string; + }; + + class RedirectedStreams { + public: + RedirectedStreams(RedirectedStreams const&) = delete; + RedirectedStreams& operator=(RedirectedStreams const&) = delete; + RedirectedStreams(RedirectedStreams&&) = delete; + RedirectedStreams& operator=(RedirectedStreams&&) = delete; + + RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr); + ~RedirectedStreams(); + private: + std::string& m_redirectedCout; + std::string& m_redirectedCerr; + RedirectedStdOut m_redirectedStdOut; + RedirectedStdErr m_redirectedStdErr; + }; + +#if defined(CATCH_CONFIG_NEW_CAPTURE) + + // Windows's implementation of std::tmpfile is terrible (it tries + // to create a file inside system folder, thus requiring elevated + // privileges for the binary), so we have to use tmpnam(_s) and + // create the file ourselves there. + class TempFile { + public: + TempFile(TempFile const&) = delete; + TempFile& operator=(TempFile const&) = delete; + TempFile(TempFile&&) = delete; + TempFile& operator=(TempFile&&) = delete; + + TempFile(); + ~TempFile(); + + std::FILE* getFile(); + std::string getContents(); + + private: + std::FILE* m_file = nullptr; + #if defined(_MSC_VER) + char m_buffer[L_tmpnam] = { 0 }; + #endif + }; + + class OutputRedirect { + public: + OutputRedirect(OutputRedirect const&) = delete; + OutputRedirect& operator=(OutputRedirect const&) = delete; + OutputRedirect(OutputRedirect&&) = delete; + OutputRedirect& operator=(OutputRedirect&&) = delete; + + OutputRedirect(std::string& stdout_dest, std::string& stderr_dest); + ~OutputRedirect(); + + private: + int m_originalStdout = -1; + int m_originalStderr = -1; + TempFile m_stdoutFile; + TempFile m_stderrFile; + std::string& m_stdoutDest; + std::string& m_stderrDest; + }; + +#endif + +} // end namespace Catch + +#endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H +// end catch_output_redirect.h +#include <cstdio> +#include <cstring> +#include <fstream> +#include <sstream> +#include <stdexcept> + +#if defined(CATCH_CONFIG_NEW_CAPTURE) + #if defined(_MSC_VER) + #include <io.h> //_dup and _dup2 + #define dup _dup + #define dup2 _dup2 + #define fileno _fileno + #else + #include <unistd.h> // dup and dup2 + #endif +#endif + +namespace Catch { + + RedirectedStream::RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream ) + : m_originalStream( originalStream ), + m_redirectionStream( redirectionStream ), + m_prevBuf( m_originalStream.rdbuf() ) + { + m_originalStream.rdbuf( m_redirectionStream.rdbuf() ); + } + + RedirectedStream::~RedirectedStream() { + m_originalStream.rdbuf( m_prevBuf ); + } + + RedirectedStdOut::RedirectedStdOut() : m_cout( Catch::cout(), m_rss.get() ) {} + auto RedirectedStdOut::str() const -> std::string { return m_rss.str(); } + + RedirectedStdErr::RedirectedStdErr() + : m_cerr( Catch::cerr(), m_rss.get() ), + m_clog( Catch::clog(), m_rss.get() ) + {} + auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); } + + RedirectedStreams::RedirectedStreams(std::string& redirectedCout, std::string& redirectedCerr) + : m_redirectedCout(redirectedCout), + m_redirectedCerr(redirectedCerr) + {} + + RedirectedStreams::~RedirectedStreams() { + m_redirectedCout += m_redirectedStdOut.str(); + m_redirectedCerr += m_redirectedStdErr.str(); + } + +#if defined(CATCH_CONFIG_NEW_CAPTURE) + +#if defined(_MSC_VER) + TempFile::TempFile() { + if (tmpnam_s(m_buffer)) { + CATCH_RUNTIME_ERROR("Could not get a temp filename"); + } + if (fopen_s(&m_file, m_buffer, "w+")) { + char buffer[100]; + if (strerror_s(buffer, errno)) { + CATCH_RUNTIME_ERROR("Could not translate errno to a string"); + } + CATCH_RUNTIME_ERROR("Could not open the temp file: '" << m_buffer << "' because: " << buffer); + } + } +#else + TempFile::TempFile() { + m_file = std::tmpfile(); + if (!m_file) { + CATCH_RUNTIME_ERROR("Could not create a temp file."); + } + } + +#endif + + TempFile::~TempFile() { + // TBD: What to do about errors here? + std::fclose(m_file); + // We manually create the file on Windows only, on Linux + // it will be autodeleted +#if defined(_MSC_VER) + std::remove(m_buffer); +#endif + } + + FILE* TempFile::getFile() { + return m_file; + } + + std::string TempFile::getContents() { + std::stringstream sstr; + char buffer[100] = {}; + std::rewind(m_file); + while (std::fgets(buffer, sizeof(buffer), m_file)) { + sstr << buffer; + } + return sstr.str(); + } + + OutputRedirect::OutputRedirect(std::string& stdout_dest, std::string& stderr_dest) : + m_originalStdout(dup(1)), + m_originalStderr(dup(2)), + m_stdoutDest(stdout_dest), + m_stderrDest(stderr_dest) { + dup2(fileno(m_stdoutFile.getFile()), 1); + dup2(fileno(m_stderrFile.getFile()), 2); + } + + OutputRedirect::~OutputRedirect() { + Catch::cout() << std::flush; + fflush(stdout); + // Since we support overriding these streams, we flush cerr + // even though std::cerr is unbuffered + Catch::cerr() << std::flush; + Catch::clog() << std::flush; + fflush(stderr); + + dup2(m_originalStdout, 1); + dup2(m_originalStderr, 2); + + m_stdoutDest += m_stdoutFile.getContents(); + m_stderrDest += m_stderrFile.getContents(); + } + +#endif // CATCH_CONFIG_NEW_CAPTURE + +} // namespace Catch + +#if defined(CATCH_CONFIG_NEW_CAPTURE) + #if defined(_MSC_VER) + #undef dup + #undef dup2 + #undef fileno + #endif +#endif +// end catch_output_redirect.cpp +// start catch_polyfills.cpp + +#include <cmath> + +namespace Catch { + +#if !defined(CATCH_CONFIG_POLYFILL_ISNAN) + bool isnan(float f) { + return std::isnan(f); + } + bool isnan(double d) { + return std::isnan(d); + } +#else + // For now we only use this for embarcadero + bool isnan(float f) { + return std::_isnan(f); + } + bool isnan(double d) { + return std::_isnan(d); + } +#endif + +} // end namespace Catch +// end catch_polyfills.cpp +// start catch_random_number_generator.cpp + +namespace Catch { + +namespace { + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4146) // we negate uint32 during the rotate +#endif + // Safe rotr implementation thanks to John Regehr + uint32_t rotate_right(uint32_t val, uint32_t count) { + const uint32_t mask = 31; + count &= mask; + return (val >> count) | (val << (-count & mask)); + } + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +} + + SimplePcg32::SimplePcg32(result_type seed_) { + seed(seed_); + } + + void SimplePcg32::seed(result_type seed_) { + m_state = 0; + (*this)(); + m_state += seed_; + (*this)(); + } + + void SimplePcg32::discard(uint64_t skip) { + // We could implement this to run in O(log n) steps, but this + // should suffice for our use case. + for (uint64_t s = 0; s < skip; ++s) { + static_cast<void>((*this)()); + } + } + + SimplePcg32::result_type SimplePcg32::operator()() { + // prepare the output value + const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u); + const auto output = rotate_right(xorshifted, m_state >> 59u); + + // advance state + m_state = m_state * 6364136223846793005ULL + s_inc; + + return output; + } + + bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs) { + return lhs.m_state == rhs.m_state; + } + + bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs) { + return lhs.m_state != rhs.m_state; + } +} +// end catch_random_number_generator.cpp +// start catch_registry_hub.cpp + +// start catch_test_case_registry_impl.h + +#include <vector> +#include <set> +#include <algorithm> +#include <ios> + +namespace Catch { + + class TestCase; + struct IConfig; + + std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ); + + bool isThrowSafe( TestCase const& testCase, IConfig const& config ); + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); + + void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ); + + std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ); + std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ); + + class TestRegistry : public ITestCaseRegistry { + public: + virtual ~TestRegistry() = default; + + virtual void registerTest( TestCase const& testCase ); + + std::vector<TestCase> const& getAllTests() const override; + std::vector<TestCase> const& getAllTestsSorted( IConfig const& config ) const override; + + private: + std::vector<TestCase> m_functions; + mutable RunTests::InWhatOrder m_currentSortOrder = RunTests::InDeclarationOrder; + mutable std::vector<TestCase> m_sortedFunctions; + std::size_t m_unnamedCount = 0; + std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised + }; + + /////////////////////////////////////////////////////////////////////////// + + class TestInvokerAsFunction : public ITestInvoker { + void(*m_testAsFunction)(); + public: + TestInvokerAsFunction( void(*testAsFunction)() ) noexcept; + + void invoke() const override; + }; + + std::string extractClassName( StringRef const& classOrQualifiedMethodName ); + + /////////////////////////////////////////////////////////////////////////// + +} // end namespace Catch + +// end catch_test_case_registry_impl.h +// start catch_reporter_registry.h + +#include <map> + +namespace Catch { + + class ReporterRegistry : public IReporterRegistry { + + public: + + ~ReporterRegistry() override; + + IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const override; + + void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ); + void registerListener( IReporterFactoryPtr const& factory ); + + FactoryMap const& getFactories() const override; + Listeners const& getListeners() const override; + + private: + FactoryMap m_factories; + Listeners m_listeners; + }; +} + +// end catch_reporter_registry.h +// start catch_tag_alias_registry.h + +// start catch_tag_alias.h + +#include <string> + +namespace Catch { + + struct TagAlias { + TagAlias(std::string const& _tag, SourceLineInfo _lineInfo); + + std::string tag; + SourceLineInfo lineInfo; + }; + +} // end namespace Catch + +// end catch_tag_alias.h +#include <map> + +namespace Catch { + + class TagAliasRegistry : public ITagAliasRegistry { + public: + ~TagAliasRegistry() override; + TagAlias const* find( std::string const& alias ) const override; + std::string expandAliases( std::string const& unexpandedTestSpec ) const override; + void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ); + + private: + std::map<std::string, TagAlias> m_registry; + }; + +} // end namespace Catch + +// end catch_tag_alias_registry.h +// start catch_startup_exception_registry.h + +#include <vector> +#include <exception> + +namespace Catch { + + class StartupExceptionRegistry { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + public: + void add(std::exception_ptr const& exception) noexcept; + std::vector<std::exception_ptr> const& getExceptions() const noexcept; + private: + std::vector<std::exception_ptr> m_exceptions; +#endif + }; + +} // end namespace Catch + +// end catch_startup_exception_registry.h +// start catch_singletons.hpp + +namespace Catch { + + struct ISingleton { + virtual ~ISingleton(); + }; + + void addSingleton( ISingleton* singleton ); + void cleanupSingletons(); + + template<typename SingletonImplT, typename InterfaceT = SingletonImplT, typename MutableInterfaceT = InterfaceT> + class Singleton : SingletonImplT, public ISingleton { + + static auto getInternal() -> Singleton* { + static Singleton* s_instance = nullptr; + if( !s_instance ) { + s_instance = new Singleton; + addSingleton( s_instance ); + } + return s_instance; + } + + public: + static auto get() -> InterfaceT const& { + return *getInternal(); + } + static auto getMutable() -> MutableInterfaceT& { + return *getInternal(); + } + }; + +} // namespace Catch + +// end catch_singletons.hpp +namespace Catch { + + namespace { + + class RegistryHub : public IRegistryHub, public IMutableRegistryHub, + private NonCopyable { + + public: // IRegistryHub + RegistryHub() = default; + IReporterRegistry const& getReporterRegistry() const override { + return m_reporterRegistry; + } + ITestCaseRegistry const& getTestCaseRegistry() const override { + return m_testCaseRegistry; + } + IExceptionTranslatorRegistry const& getExceptionTranslatorRegistry() const override { + return m_exceptionTranslatorRegistry; + } + ITagAliasRegistry const& getTagAliasRegistry() const override { + return m_tagAliasRegistry; + } + StartupExceptionRegistry const& getStartupExceptionRegistry() const override { + return m_exceptionRegistry; + } + + public: // IMutableRegistryHub + void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) override { + m_reporterRegistry.registerReporter( name, factory ); + } + void registerListener( IReporterFactoryPtr const& factory ) override { + m_reporterRegistry.registerListener( factory ); + } + void registerTest( TestCase const& testInfo ) override { + m_testCaseRegistry.registerTest( testInfo ); + } + void registerTranslator( const IExceptionTranslator* translator ) override { + m_exceptionTranslatorRegistry.registerTranslator( translator ); + } + void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) override { + m_tagAliasRegistry.add( alias, tag, lineInfo ); + } + void registerStartupException() noexcept override { +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + m_exceptionRegistry.add(std::current_exception()); +#else + CATCH_INTERNAL_ERROR("Attempted to register active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!"); +#endif + } + IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override { + return m_enumValuesRegistry; + } + + private: + TestRegistry m_testCaseRegistry; + ReporterRegistry m_reporterRegistry; + ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; + TagAliasRegistry m_tagAliasRegistry; + StartupExceptionRegistry m_exceptionRegistry; + Detail::EnumValuesRegistry m_enumValuesRegistry; + }; + } + + using RegistryHubSingleton = Singleton<RegistryHub, IRegistryHub, IMutableRegistryHub>; + + IRegistryHub const& getRegistryHub() { + return RegistryHubSingleton::get(); + } + IMutableRegistryHub& getMutableRegistryHub() { + return RegistryHubSingleton::getMutable(); + } + void cleanUp() { + cleanupSingletons(); + cleanUpContext(); + } + std::string translateActiveException() { + return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); + } + +} // end namespace Catch +// end catch_registry_hub.cpp +// start catch_reporter_registry.cpp + +namespace Catch { + + ReporterRegistry::~ReporterRegistry() = default; + + IStreamingReporterPtr ReporterRegistry::create( std::string const& name, IConfigPtr const& config ) const { + auto it = m_factories.find( name ); + if( it == m_factories.end() ) + return nullptr; + return it->second->create( ReporterConfig( config ) ); + } + + void ReporterRegistry::registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) { + m_factories.emplace(name, factory); + } + void ReporterRegistry::registerListener( IReporterFactoryPtr const& factory ) { + m_listeners.push_back( factory ); + } + + IReporterRegistry::FactoryMap const& ReporterRegistry::getFactories() const { + return m_factories; + } + IReporterRegistry::Listeners const& ReporterRegistry::getListeners() const { + return m_listeners; + } + +} +// end catch_reporter_registry.cpp +// start catch_result_type.cpp + +namespace Catch { + + bool isOk( ResultWas::OfType resultType ) { + return ( resultType & ResultWas::FailureBit ) == 0; + } + bool isJustInfo( int flags ) { + return flags == ResultWas::Info; + } + + ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { + return static_cast<ResultDisposition::Flags>( static_cast<int>( lhs ) | static_cast<int>( rhs ) ); + } + + bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } + bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } + +} // end namespace Catch +// end catch_result_type.cpp +// start catch_run_context.cpp + +#include <cassert> +#include <algorithm> +#include <sstream> + +namespace Catch { + + namespace Generators { + struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorTracker { + GeneratorBasePtr m_generator; + + GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : TrackerBase( nameAndLocation, ctx, parent ) + {} + ~GeneratorTracker(); + + static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTracking::NameAndLocation const& nameAndLocation ) { + std::shared_ptr<GeneratorTracker> tracker; + + ITracker& currentTracker = ctx.currentTracker(); + // Under specific circumstances, the generator we want + // to acquire is also the current tracker. If this is + // the case, we have to avoid looking through current + // tracker's children, and instead return the current + // tracker. + // A case where this check is important is e.g. + // for (int i = 0; i < 5; ++i) { + // int n = GENERATE(1, 2); + // } + // + // without it, the code above creates 5 nested generators. + if (currentTracker.nameAndLocation() == nameAndLocation) { + auto thisTracker = currentTracker.parent().findChild(nameAndLocation); + assert(thisTracker); + assert(thisTracker->isGeneratorTracker()); + tracker = std::static_pointer_cast<GeneratorTracker>(thisTracker); + } else if ( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isGeneratorTracker() ); + tracker = std::static_pointer_cast<GeneratorTracker>( childTracker ); + } else { + tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, ¤tTracker ); + currentTracker.addChild( tracker ); + } + + if( !tracker->isComplete() ) { + tracker->open(); + } + + return *tracker; + } + + // TrackerBase interface + bool isGeneratorTracker() const override { return true; } + auto hasGenerator() const -> bool override { + return !!m_generator; + } + void close() override { + TrackerBase::close(); + // If a generator has a child (it is followed by a section) + // and none of its children have started, then we must wait + // until later to start consuming its values. + // This catches cases where `GENERATE` is placed between two + // `SECTION`s. + // **The check for m_children.empty cannot be removed**. + // doing so would break `GENERATE` _not_ followed by `SECTION`s. + const bool should_wait_for_child = [&]() { + // No children -> nobody to wait for + if ( m_children.empty() ) { + return false; + } + // If at least one child started executing, don't wait + if ( std::find_if( + m_children.begin(), + m_children.end(), + []( TestCaseTracking::ITrackerPtr tracker ) { + return tracker->hasStarted(); + } ) != m_children.end() ) { + return false; + } + + // No children have started. We need to check if they _can_ + // start, and thus we should wait for them, or they cannot + // start (due to filters), and we shouldn't wait for them + auto* parent = m_parent; + // This is safe: there is always at least one section + // tracker in a test case tracking tree + while ( !parent->isSectionTracker() ) { + parent = &( parent->parent() ); + } + assert( parent && + "Missing root (test case) level section" ); + + auto const& parentSection = + static_cast<SectionTracker&>( *parent ); + auto const& filters = parentSection.getFilters(); + // No filters -> no restrictions on running sections + if ( filters.empty() ) { + return true; + } + + for ( auto const& child : m_children ) { + if ( child->isSectionTracker() && + std::find( filters.begin(), + filters.end(), + static_cast<SectionTracker&>( *child ) + .trimmedName() ) != + filters.end() ) { + return true; + } + } + return false; + }(); + + // This check is a bit tricky, because m_generator->next() + // has a side-effect, where it consumes generator's current + // value, but we do not want to invoke the side-effect if + // this generator is still waiting for any child to start. + if ( should_wait_for_child || + ( m_runState == CompletedSuccessfully && + m_generator->next() ) ) { + m_children.clear(); + m_runState = Executing; + } + } + + // IGeneratorTracker interface + auto getGenerator() const -> GeneratorBasePtr const& override { + return m_generator; + } + void setGenerator( GeneratorBasePtr&& generator ) override { + m_generator = std::move( generator ); + } + }; + GeneratorTracker::~GeneratorTracker() {} + } + + RunContext::RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter) + : m_runInfo(_config->name()), + m_context(getCurrentMutableContext()), + m_config(_config), + m_reporter(std::move(reporter)), + m_lastAssertionInfo{ StringRef(), SourceLineInfo("",0), StringRef(), ResultDisposition::Normal }, + m_includeSuccessfulResults( m_config->includeSuccessfulResults() || m_reporter->getPreferences().shouldReportAllAssertions ) + { + m_context.setRunner(this); + m_context.setConfig(m_config); + m_context.setResultCapture(this); + m_reporter->testRunStarting(m_runInfo); + } + + RunContext::~RunContext() { + m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, aborting())); + } + + void RunContext::testGroupStarting(std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount) { + m_reporter->testGroupStarting(GroupInfo(testSpec, groupIndex, groupsCount)); + } + + void RunContext::testGroupEnded(std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount) { + m_reporter->testGroupEnded(TestGroupStats(GroupInfo(testSpec, groupIndex, groupsCount), totals, aborting())); + } + + Totals RunContext::runTest(TestCase const& testCase) { + Totals prevTotals = m_totals; + + std::string redirectedCout; + std::string redirectedCerr; + + auto const& testInfo = testCase.getTestCaseInfo(); + + m_reporter->testCaseStarting(testInfo); + + m_activeTestCase = &testCase; + + ITracker& rootTracker = m_trackerContext.startRun(); + assert(rootTracker.isSectionTracker()); + static_cast<SectionTracker&>(rootTracker).addInitialFilters(m_config->getSectionsToRun()); + do { + m_trackerContext.startCycle(); + m_testCaseTracker = &SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(testInfo.name, testInfo.lineInfo)); + runCurrentTest(redirectedCout, redirectedCerr); + } while (!m_testCaseTracker->isSuccessfullyCompleted() && !aborting()); + + Totals deltaTotals = m_totals.delta(prevTotals); + if (testInfo.expectedToFail() && deltaTotals.testCases.passed > 0) { + deltaTotals.assertions.failed++; + deltaTotals.testCases.passed--; + deltaTotals.testCases.failed++; + } + m_totals.testCases += deltaTotals.testCases; + m_reporter->testCaseEnded(TestCaseStats(testInfo, + deltaTotals, + redirectedCout, + redirectedCerr, + aborting())); + + m_activeTestCase = nullptr; + m_testCaseTracker = nullptr; + + return deltaTotals; + } + + IConfigPtr RunContext::config() const { + return m_config; + } + + IStreamingReporter& RunContext::reporter() const { + return *m_reporter; + } + + void RunContext::assertionEnded(AssertionResult const & result) { + if (result.getResultType() == ResultWas::Ok) { + m_totals.assertions.passed++; + m_lastAssertionPassed = true; + } else if (!result.isOk()) { + m_lastAssertionPassed = false; + if( m_activeTestCase->getTestCaseInfo().okToFail() ) + m_totals.assertions.failedButOk++; + else + m_totals.assertions.failed++; + } + else { + m_lastAssertionPassed = true; + } + + // We have no use for the return value (whether messages should be cleared), because messages were made scoped + // and should be let to clear themselves out. + static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals))); + + if (result.getResultType() != ResultWas::Warning) + m_messageScopes.clear(); + + // Reset working state + resetAssertionInfo(); + m_lastResult = result; + } + void RunContext::resetAssertionInfo() { + m_lastAssertionInfo.macroName = StringRef(); + m_lastAssertionInfo.capturedExpression = "{Unknown expression after the reported line}"_sr; + } + + bool RunContext::sectionStarted(SectionInfo const & sectionInfo, Counts & assertions) { + ITracker& sectionTracker = SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(sectionInfo.name, sectionInfo.lineInfo)); + if (!sectionTracker.isOpen()) + return false; + m_activeSections.push_back(§ionTracker); + + m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; + + m_reporter->sectionStarting(sectionInfo); + + assertions = m_totals.assertions; + + return true; + } + auto RunContext::acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { + using namespace Generators; + GeneratorTracker& tracker = GeneratorTracker::acquire(m_trackerContext, + TestCaseTracking::NameAndLocation( static_cast<std::string>(generatorName), lineInfo ) ); + m_lastAssertionInfo.lineInfo = lineInfo; + return tracker; + } + + bool RunContext::testForMissingAssertions(Counts& assertions) { + if (assertions.total() != 0) + return false; + if (!m_config->warnAboutMissingAssertions()) + return false; + if (m_trackerContext.currentTracker().hasChildren()) + return false; + m_totals.assertions.failed++; + assertions.failed++; + return true; + } + + void RunContext::sectionEnded(SectionEndInfo const & endInfo) { + Counts assertions = m_totals.assertions - endInfo.prevAssertions; + bool missingAssertions = testForMissingAssertions(assertions); + + if (!m_activeSections.empty()) { + m_activeSections.back()->close(); + m_activeSections.pop_back(); + } + + m_reporter->sectionEnded(SectionStats(endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions)); + m_messages.clear(); + m_messageScopes.clear(); + } + + void RunContext::sectionEndedEarly(SectionEndInfo const & endInfo) { + if (m_unfinishedSections.empty()) + m_activeSections.back()->fail(); + else + m_activeSections.back()->close(); + m_activeSections.pop_back(); + + m_unfinishedSections.push_back(endInfo); + } + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void RunContext::benchmarkPreparing(std::string const& name) { + m_reporter->benchmarkPreparing(name); + } + void RunContext::benchmarkStarting( BenchmarkInfo const& info ) { + m_reporter->benchmarkStarting( info ); + } + void RunContext::benchmarkEnded( BenchmarkStats<> const& stats ) { + m_reporter->benchmarkEnded( stats ); + } + void RunContext::benchmarkFailed(std::string const & error) { + m_reporter->benchmarkFailed(error); + } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void RunContext::pushScopedMessage(MessageInfo const & message) { + m_messages.push_back(message); + } + + void RunContext::popScopedMessage(MessageInfo const & message) { + m_messages.erase(std::remove(m_messages.begin(), m_messages.end(), message), m_messages.end()); + } + + void RunContext::emplaceUnscopedMessage( MessageBuilder const& builder ) { + m_messageScopes.emplace_back( builder ); + } + + std::string RunContext::getCurrentTestName() const { + return m_activeTestCase + ? m_activeTestCase->getTestCaseInfo().name + : std::string(); + } + + const AssertionResult * RunContext::getLastResult() const { + return &(*m_lastResult); + } + + void RunContext::exceptionEarlyReported() { + m_shouldReportUnexpected = false; + } + + void RunContext::handleFatalErrorCondition( StringRef message ) { + // First notify reporter that bad things happened + m_reporter->fatalErrorEncountered(message); + + // Don't rebuild the result -- the stringification itself can cause more fatal errors + // Instead, fake a result data. + AssertionResultData tempResult( ResultWas::FatalErrorCondition, { false } ); + tempResult.message = static_cast<std::string>(message); + AssertionResult result(m_lastAssertionInfo, tempResult); + + assertionEnded(result); + + handleUnfinishedSections(); + + // Recreate section for test case (as we will lose the one that was in scope) + auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name); + + Counts assertions; + assertions.failed = 1; + SectionStats testCaseSectionStats(testCaseSection, assertions, 0, false); + m_reporter->sectionEnded(testCaseSectionStats); + + auto const& testInfo = m_activeTestCase->getTestCaseInfo(); + + Totals deltaTotals; + deltaTotals.testCases.failed = 1; + deltaTotals.assertions.failed = 1; + m_reporter->testCaseEnded(TestCaseStats(testInfo, + deltaTotals, + std::string(), + std::string(), + false)); + m_totals.testCases.failed++; + testGroupEnded(std::string(), m_totals, 1, 1); + m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false)); + } + + bool RunContext::lastAssertionPassed() { + return m_lastAssertionPassed; + } + + void RunContext::assertionPassed() { + m_lastAssertionPassed = true; + ++m_totals.assertions.passed; + resetAssertionInfo(); + m_messageScopes.clear(); + } + + bool RunContext::aborting() const { + return m_totals.assertions.failed >= static_cast<std::size_t>(m_config->abortAfter()); + } + + void RunContext::runCurrentTest(std::string & redirectedCout, std::string & redirectedCerr) { + auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); + SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name); + m_reporter->sectionStarting(testCaseSection); + Counts prevAssertions = m_totals.assertions; + double duration = 0; + m_shouldReportUnexpected = true; + m_lastAssertionInfo = { "TEST_CASE"_sr, testCaseInfo.lineInfo, StringRef(), ResultDisposition::Normal }; + + seedRng(*m_config); + + Timer timer; + CATCH_TRY { + if (m_reporter->getPreferences().shouldRedirectStdOut) { +#if !defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) + RedirectedStreams redirectedStreams(redirectedCout, redirectedCerr); + + timer.start(); + invokeActiveTestCase(); +#else + OutputRedirect r(redirectedCout, redirectedCerr); + timer.start(); + invokeActiveTestCase(); +#endif + } else { + timer.start(); + invokeActiveTestCase(); + } + duration = timer.getElapsedSeconds(); + } CATCH_CATCH_ANON (TestFailureException&) { + // This just means the test was aborted due to failure + } CATCH_CATCH_ALL { + // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions + // are reported without translation at the point of origin. + if( m_shouldReportUnexpected ) { + AssertionReaction dummyReaction; + handleUnexpectedInflightException( m_lastAssertionInfo, translateActiveException(), dummyReaction ); + } + } + Counts assertions = m_totals.assertions - prevAssertions; + bool missingAssertions = testForMissingAssertions(assertions); + + m_testCaseTracker->close(); + handleUnfinishedSections(); + m_messages.clear(); + m_messageScopes.clear(); + + SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions); + m_reporter->sectionEnded(testCaseSectionStats); + } + + void RunContext::invokeActiveTestCase() { + FatalConditionHandler fatalConditionHandler; // Handle signals + m_activeTestCase->invoke(); + fatalConditionHandler.reset(); + } + + void RunContext::handleUnfinishedSections() { + // If sections ended prematurely due to an exception we stored their + // infos here so we can tear them down outside the unwind process. + for (auto it = m_unfinishedSections.rbegin(), + itEnd = m_unfinishedSections.rend(); + it != itEnd; + ++it) + sectionEnded(*it); + m_unfinishedSections.clear(); + } + + void RunContext::handleExpr( + AssertionInfo const& info, + ITransientExpression const& expr, + AssertionReaction& reaction + ) { + m_reporter->assertionStarting( info ); + + bool negated = isFalseTest( info.resultDisposition ); + bool result = expr.getResult() != negated; + + if( result ) { + if (!m_includeSuccessfulResults) { + assertionPassed(); + } + else { + reportExpr(info, ResultWas::Ok, &expr, negated); + } + } + else { + reportExpr(info, ResultWas::ExpressionFailed, &expr, negated ); + populateReaction( reaction ); + } + } + void RunContext::reportExpr( + AssertionInfo const &info, + ResultWas::OfType resultType, + ITransientExpression const *expr, + bool negated ) { + + m_lastAssertionInfo = info; + AssertionResultData data( resultType, LazyExpression( negated ) ); + + AssertionResult assertionResult{ info, data }; + assertionResult.m_resultData.lazyExpression.m_transientExpression = expr; + + assertionEnded( assertionResult ); + } + + void RunContext::handleMessage( + AssertionInfo const& info, + ResultWas::OfType resultType, + StringRef const& message, + AssertionReaction& reaction + ) { + m_reporter->assertionStarting( info ); + + m_lastAssertionInfo = info; + + AssertionResultData data( resultType, LazyExpression( false ) ); + data.message = static_cast<std::string>(message); + AssertionResult assertionResult{ m_lastAssertionInfo, data }; + assertionEnded( assertionResult ); + if( !assertionResult.isOk() ) + populateReaction( reaction ); + } + void RunContext::handleUnexpectedExceptionNotThrown( + AssertionInfo const& info, + AssertionReaction& reaction + ) { + handleNonExpr(info, Catch::ResultWas::DidntThrowException, reaction); + } + + void RunContext::handleUnexpectedInflightException( + AssertionInfo const& info, + std::string const& message, + AssertionReaction& reaction + ) { + m_lastAssertionInfo = info; + + AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) ); + data.message = message; + AssertionResult assertionResult{ info, data }; + assertionEnded( assertionResult ); + populateReaction( reaction ); + } + + void RunContext::populateReaction( AssertionReaction& reaction ) { + reaction.shouldDebugBreak = m_config->shouldDebugBreak(); + reaction.shouldThrow = aborting() || (m_lastAssertionInfo.resultDisposition & ResultDisposition::Normal); + } + + void RunContext::handleIncomplete( + AssertionInfo const& info + ) { + m_lastAssertionInfo = info; + + AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) ); + data.message = "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE"; + AssertionResult assertionResult{ info, data }; + assertionEnded( assertionResult ); + } + void RunContext::handleNonExpr( + AssertionInfo const &info, + ResultWas::OfType resultType, + AssertionReaction &reaction + ) { + m_lastAssertionInfo = info; + + AssertionResultData data( resultType, LazyExpression( false ) ); + AssertionResult assertionResult{ info, data }; + assertionEnded( assertionResult ); + + if( !assertionResult.isOk() ) + populateReaction( reaction ); + } + + IResultCapture& getResultCapture() { + if (auto* capture = getCurrentContext().getResultCapture()) + return *capture; + else + CATCH_INTERNAL_ERROR("No result capture instance"); + } + + void seedRng(IConfig const& config) { + if (config.rngSeed() != 0) { + std::srand(config.rngSeed()); + rng().seed(config.rngSeed()); + } + } + + unsigned int rngSeed() { + return getCurrentContext().getConfig()->rngSeed(); + } + +} +// end catch_run_context.cpp +// start catch_section.cpp + +namespace Catch { + + Section::Section( SectionInfo const& info ) + : m_info( info ), + m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) + { + m_timer.start(); + } + + Section::~Section() { + if( m_sectionIncluded ) { + SectionEndInfo endInfo{ m_info, m_assertions, m_timer.getElapsedSeconds() }; + if( uncaught_exceptions() ) + getResultCapture().sectionEndedEarly( endInfo ); + else + getResultCapture().sectionEnded( endInfo ); + } + } + + // This indicates whether the section should be executed or not + Section::operator bool() const { + return m_sectionIncluded; + } + +} // end namespace Catch +// end catch_section.cpp +// start catch_section_info.cpp + +namespace Catch { + + SectionInfo::SectionInfo + ( SourceLineInfo const& _lineInfo, + std::string const& _name ) + : name( _name ), + lineInfo( _lineInfo ) + {} + +} // end namespace Catch +// end catch_section_info.cpp +// start catch_session.cpp + +// start catch_session.h + +#include <memory> + +namespace Catch { + + class Session : NonCopyable { + public: + + Session(); + ~Session() override; + + void showHelp() const; + void libIdentify(); + + int applyCommandLine( int argc, char const * const * argv ); + #if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE) + int applyCommandLine( int argc, wchar_t const * const * argv ); + #endif + + void useConfigData( ConfigData const& configData ); + + template<typename CharT> + int run(int argc, CharT const * const argv[]) { + if (m_startupExceptions) + return 1; + int returnCode = applyCommandLine(argc, argv); + if (returnCode == 0) + returnCode = run(); + return returnCode; + } + + int run(); + + clara::Parser const& cli() const; + void cli( clara::Parser const& newParser ); + ConfigData& configData(); + Config& config(); + private: + int runInternal(); + + clara::Parser m_cli; + ConfigData m_configData; + std::shared_ptr<Config> m_config; + bool m_startupExceptions = false; + }; + +} // end namespace Catch + +// end catch_session.h +// start catch_version.h + +#include <iosfwd> + +namespace Catch { + + // Versioning information + struct Version { + Version( Version const& ) = delete; + Version& operator=( Version const& ) = delete; + Version( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ); + + unsigned int const majorVersion; + unsigned int const minorVersion; + unsigned int const patchNumber; + + // buildNumber is only used if branchName is not null + char const * const branchName; + unsigned int const buildNumber; + + friend std::ostream& operator << ( std::ostream& os, Version const& version ); + }; + + Version const& libraryVersion(); +} + +// end catch_version.h +#include <cstdlib> +#include <iomanip> +#include <set> +#include <iterator> + +namespace Catch { + + namespace { + const int MaxExitCode = 255; + + IStreamingReporterPtr createReporter(std::string const& reporterName, IConfigPtr const& config) { + auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, config); + CATCH_ENFORCE(reporter, "No reporter registered with name: '" << reporterName << "'"); + + return reporter; + } + + IStreamingReporterPtr makeReporter(std::shared_ptr<Config> const& config) { + if (Catch::getRegistryHub().getReporterRegistry().getListeners().empty()) { + return createReporter(config->getReporterName(), config); + } + + // On older platforms, returning std::unique_ptr<ListeningReporter> + // when the return type is std::unique_ptr<IStreamingReporter> + // doesn't compile without a std::move call. However, this causes + // a warning on newer platforms. Thus, we have to work around + // it a bit and downcast the pointer manually. + auto ret = std::unique_ptr<IStreamingReporter>(new ListeningReporter); + auto& multi = static_cast<ListeningReporter&>(*ret); + auto const& listeners = Catch::getRegistryHub().getReporterRegistry().getListeners(); + for (auto const& listener : listeners) { + multi.addListener(listener->create(Catch::ReporterConfig(config))); + } + multi.addReporter(createReporter(config->getReporterName(), config)); + return ret; + } + + class TestGroup { + public: + explicit TestGroup(std::shared_ptr<Config> const& config) + : m_config{config} + , m_context{config, makeReporter(config)} + { + auto const& allTestCases = getAllTestCasesSorted(*m_config); + m_matches = m_config->testSpec().matchesByFilter(allTestCases, *m_config); + auto const& invalidArgs = m_config->testSpec().getInvalidArgs(); + + if (m_matches.empty() && invalidArgs.empty()) { + for (auto const& test : allTestCases) + if (!test.isHidden()) + m_tests.emplace(&test); + } else { + for (auto const& match : m_matches) + m_tests.insert(match.tests.begin(), match.tests.end()); + } + } + + Totals execute() { + auto const& invalidArgs = m_config->testSpec().getInvalidArgs(); + Totals totals; + m_context.testGroupStarting(m_config->name(), 1, 1); + for (auto const& testCase : m_tests) { + if (!m_context.aborting()) + totals += m_context.runTest(*testCase); + else + m_context.reporter().skipTest(*testCase); + } + + for (auto const& match : m_matches) { + if (match.tests.empty()) { + m_context.reporter().noMatchingTestCases(match.name); + totals.error = -1; + } + } + + if (!invalidArgs.empty()) { + for (auto const& invalidArg: invalidArgs) + m_context.reporter().reportInvalidArguments(invalidArg); + } + + m_context.testGroupEnded(m_config->name(), totals, 1, 1); + return totals; + } + + private: + using Tests = std::set<TestCase const*>; + + std::shared_ptr<Config> m_config; + RunContext m_context; + Tests m_tests; + TestSpec::Matches m_matches; + }; + + void applyFilenamesAsTags(Catch::IConfig const& config) { + auto& tests = const_cast<std::vector<TestCase>&>(getAllTestCasesSorted(config)); + for (auto& testCase : tests) { + auto tags = testCase.tags; + + std::string filename = testCase.lineInfo.file; + auto lastSlash = filename.find_last_of("\\/"); + if (lastSlash != std::string::npos) { + filename.erase(0, lastSlash); + filename[0] = '#'; + } + + auto lastDot = filename.find_last_of('.'); + if (lastDot != std::string::npos) { + filename.erase(lastDot); + } + + tags.push_back(std::move(filename)); + setTags(testCase, tags); + } + } + + } // anon namespace + + Session::Session() { + static bool alreadyInstantiated = false; + if( alreadyInstantiated ) { + CATCH_TRY { CATCH_INTERNAL_ERROR( "Only one instance of Catch::Session can ever be used" ); } + CATCH_CATCH_ALL { getMutableRegistryHub().registerStartupException(); } + } + + // There cannot be exceptions at startup in no-exception mode. +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + const auto& exceptions = getRegistryHub().getStartupExceptionRegistry().getExceptions(); + if ( !exceptions.empty() ) { + config(); + getCurrentMutableContext().setConfig(m_config); + + m_startupExceptions = true; + Colour colourGuard( Colour::Red ); + Catch::cerr() << "Errors occurred during startup!" << '\n'; + // iterate over all exceptions and notify user + for ( const auto& ex_ptr : exceptions ) { + try { + std::rethrow_exception(ex_ptr); + } catch ( std::exception const& ex ) { + Catch::cerr() << Column( ex.what() ).indent(2) << '\n'; + } + } + } +#endif + + alreadyInstantiated = true; + m_cli = makeCommandLineParser( m_configData ); + } + Session::~Session() { + Catch::cleanUp(); + } + + void Session::showHelp() const { + Catch::cout() + << "\nCatch v" << libraryVersion() << "\n" + << m_cli << std::endl + << "For more detailed usage please see the project docs\n" << std::endl; + } + void Session::libIdentify() { + Catch::cout() + << std::left << std::setw(16) << "description: " << "A Catch2 test executable\n" + << std::left << std::setw(16) << "category: " << "testframework\n" + << std::left << std::setw(16) << "framework: " << "Catch Test\n" + << std::left << std::setw(16) << "version: " << libraryVersion() << std::endl; + } + + int Session::applyCommandLine( int argc, char const * const * argv ) { + if( m_startupExceptions ) + return 1; + + auto result = m_cli.parse( clara::Args( argc, argv ) ); + if( !result ) { + config(); + getCurrentMutableContext().setConfig(m_config); + Catch::cerr() + << Colour( Colour::Red ) + << "\nError(s) in input:\n" + << Column( result.errorMessage() ).indent( 2 ) + << "\n\n"; + Catch::cerr() << "Run with -? for usage\n" << std::endl; + return MaxExitCode; + } + + if( m_configData.showHelp ) + showHelp(); + if( m_configData.libIdentify ) + libIdentify(); + m_config.reset(); + return 0; + } + +#if defined(CATCH_CONFIG_WCHAR) && defined(_WIN32) && defined(UNICODE) + int Session::applyCommandLine( int argc, wchar_t const * const * argv ) { + + char **utf8Argv = new char *[ argc ]; + + for ( int i = 0; i < argc; ++i ) { + int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, nullptr, 0, nullptr, nullptr ); + + utf8Argv[ i ] = new char[ bufSize ]; + + WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, nullptr, nullptr ); + } + + int returnCode = applyCommandLine( argc, utf8Argv ); + + for ( int i = 0; i < argc; ++i ) + delete [] utf8Argv[ i ]; + + delete [] utf8Argv; + + return returnCode; + } +#endif + + void Session::useConfigData( ConfigData const& configData ) { + m_configData = configData; + m_config.reset(); + } + + int Session::run() { + if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeStart ) != 0 ) { + Catch::cout() << "...waiting for enter/ return before starting" << std::endl; + static_cast<void>(std::getchar()); + } + int exitCode = runInternal(); + if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeExit ) != 0 ) { + Catch::cout() << "...waiting for enter/ return before exiting, with code: " << exitCode << std::endl; + static_cast<void>(std::getchar()); + } + return exitCode; + } + + clara::Parser const& Session::cli() const { + return m_cli; + } + void Session::cli( clara::Parser const& newParser ) { + m_cli = newParser; + } + ConfigData& Session::configData() { + return m_configData; + } + Config& Session::config() { + if( !m_config ) + m_config = std::make_shared<Config>( m_configData ); + return *m_config; + } + + int Session::runInternal() { + if( m_startupExceptions ) + return 1; + + if (m_configData.showHelp || m_configData.libIdentify) { + return 0; + } + + CATCH_TRY { + config(); // Force config to be constructed + + seedRng( *m_config ); + + if( m_configData.filenamesAsTags ) + applyFilenamesAsTags( *m_config ); + + // Handle list request + if( Option<std::size_t> listed = list( m_config ) ) + return static_cast<int>( *listed ); + + TestGroup tests { m_config }; + auto const totals = tests.execute(); + + if( m_config->warnAboutNoTests() && totals.error == -1 ) + return 2; + + // Note that on unices only the lower 8 bits are usually used, clamping + // the return value to 255 prevents false negative when some multiple + // of 256 tests has failed + return (std::min) (MaxExitCode, (std::max) (totals.error, static_cast<int>(totals.assertions.failed))); + } +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + catch( std::exception& ex ) { + Catch::cerr() << ex.what() << std::endl; + return MaxExitCode; + } +#endif + } + +} // end namespace Catch +// end catch_session.cpp +// start catch_singletons.cpp + +#include <vector> + +namespace Catch { + + namespace { + static auto getSingletons() -> std::vector<ISingleton*>*& { + static std::vector<ISingleton*>* g_singletons = nullptr; + if( !g_singletons ) + g_singletons = new std::vector<ISingleton*>(); + return g_singletons; + } + } + + ISingleton::~ISingleton() {} + + void addSingleton(ISingleton* singleton ) { + getSingletons()->push_back( singleton ); + } + void cleanupSingletons() { + auto& singletons = getSingletons(); + for( auto singleton : *singletons ) + delete singleton; + delete singletons; + singletons = nullptr; + } + +} // namespace Catch +// end catch_singletons.cpp +// start catch_startup_exception_registry.cpp + +#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) +namespace Catch { +void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { + CATCH_TRY { + m_exceptions.push_back(exception); + } CATCH_CATCH_ALL { + // If we run out of memory during start-up there's really not a lot more we can do about it + std::terminate(); + } + } + + std::vector<std::exception_ptr> const& StartupExceptionRegistry::getExceptions() const noexcept { + return m_exceptions; + } + +} // end namespace Catch +#endif +// end catch_startup_exception_registry.cpp +// start catch_stream.cpp + +#include <cstdio> +#include <iostream> +#include <fstream> +#include <sstream> +#include <vector> +#include <memory> + +namespace Catch { + + Catch::IStream::~IStream() = default; + + namespace Detail { namespace { + template<typename WriterF, std::size_t bufferSize=256> + class StreamBufImpl : public std::streambuf { + char data[bufferSize]; + WriterF m_writer; + + public: + StreamBufImpl() { + setp( data, data + sizeof(data) ); + } + + ~StreamBufImpl() noexcept { + StreamBufImpl::sync(); + } + + private: + int overflow( int c ) override { + sync(); + + if( c != EOF ) { + if( pbase() == epptr() ) + m_writer( std::string( 1, static_cast<char>( c ) ) ); + else + sputc( static_cast<char>( c ) ); + } + return 0; + } + + int sync() override { + if( pbase() != pptr() ) { + m_writer( std::string( pbase(), static_cast<std::string::size_type>( pptr() - pbase() ) ) ); + setp( pbase(), epptr() ); + } + return 0; + } + }; + + /////////////////////////////////////////////////////////////////////////// + + struct OutputDebugWriter { + + void operator()( std::string const&str ) { + writeToDebugConsole( str ); + } + }; + + /////////////////////////////////////////////////////////////////////////// + + class FileStream : public IStream { + mutable std::ofstream m_ofs; + public: + FileStream( StringRef filename ) { + m_ofs.open( filename.c_str() ); + CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" ); + } + ~FileStream() override = default; + public: // IStream + std::ostream& stream() const override { + return m_ofs; + } + }; + + /////////////////////////////////////////////////////////////////////////// + + class CoutStream : public IStream { + mutable std::ostream m_os; + public: + // Store the streambuf from cout up-front because + // cout may get redirected when running tests + CoutStream() : m_os( Catch::cout().rdbuf() ) {} + ~CoutStream() override = default; + + public: // IStream + std::ostream& stream() const override { return m_os; } + }; + + /////////////////////////////////////////////////////////////////////////// + + class DebugOutStream : public IStream { + std::unique_ptr<StreamBufImpl<OutputDebugWriter>> m_streamBuf; + mutable std::ostream m_os; + public: + DebugOutStream() + : m_streamBuf( new StreamBufImpl<OutputDebugWriter>() ), + m_os( m_streamBuf.get() ) + {} + + ~DebugOutStream() override = default; + + public: // IStream + std::ostream& stream() const override { return m_os; } + }; + + }} // namespace anon::detail + + /////////////////////////////////////////////////////////////////////////// + + auto makeStream( StringRef const &filename ) -> IStream const* { + if( filename.empty() ) + return new Detail::CoutStream(); + else if( filename[0] == '%' ) { + if( filename == "%debug" ) + return new Detail::DebugOutStream(); + else + CATCH_ERROR( "Unrecognised stream: '" << filename << "'" ); + } + else + return new Detail::FileStream( filename ); + } + + // This class encapsulates the idea of a pool of ostringstreams that can be reused. + struct StringStreams { + std::vector<std::unique_ptr<std::ostringstream>> m_streams; + std::vector<std::size_t> m_unused; + std::ostringstream m_referenceStream; // Used for copy state/ flags from + + auto add() -> std::size_t { + if( m_unused.empty() ) { + m_streams.push_back( std::unique_ptr<std::ostringstream>( new std::ostringstream ) ); + return m_streams.size()-1; + } + else { + auto index = m_unused.back(); + m_unused.pop_back(); + return index; + } + } + + void release( std::size_t index ) { + m_streams[index]->copyfmt( m_referenceStream ); // Restore initial flags and other state + m_unused.push_back(index); + } + }; + + ReusableStringStream::ReusableStringStream() + : m_index( Singleton<StringStreams>::getMutable().add() ), + m_oss( Singleton<StringStreams>::getMutable().m_streams[m_index].get() ) + {} + + ReusableStringStream::~ReusableStringStream() { + static_cast<std::ostringstream*>( m_oss )->str(""); + m_oss->clear(); + Singleton<StringStreams>::getMutable().release( m_index ); + } + + auto ReusableStringStream::str() const -> std::string { + return static_cast<std::ostringstream*>( m_oss )->str(); + } + + /////////////////////////////////////////////////////////////////////////// + +#ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions + std::ostream& cout() { return std::cout; } + std::ostream& cerr() { return std::cerr; } + std::ostream& clog() { return std::clog; } +#endif +} +// end catch_stream.cpp +// start catch_string_manip.cpp + +#include <algorithm> +#include <ostream> +#include <cstring> +#include <cctype> +#include <vector> + +namespace Catch { + + namespace { + char toLowerCh(char c) { + return static_cast<char>( std::tolower( static_cast<unsigned char>(c) ) ); + } + } + + bool startsWith( std::string const& s, std::string const& prefix ) { + return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); + } + bool startsWith( std::string const& s, char prefix ) { + return !s.empty() && s[0] == prefix; + } + bool endsWith( std::string const& s, std::string const& suffix ) { + return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin()); + } + bool endsWith( std::string const& s, char suffix ) { + return !s.empty() && s[s.size()-1] == suffix; + } + bool contains( std::string const& s, std::string const& infix ) { + return s.find( infix ) != std::string::npos; + } + void toLowerInPlace( std::string& s ) { + std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); + } + std::string toLower( std::string const& s ) { + std::string lc = s; + toLowerInPlace( lc ); + return lc; + } + std::string trim( std::string const& str ) { + static char const* whitespaceChars = "\n\r\t "; + std::string::size_type start = str.find_first_not_of( whitespaceChars ); + std::string::size_type end = str.find_last_not_of( whitespaceChars ); + + return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); + } + + StringRef trim(StringRef ref) { + const auto is_ws = [](char c) { + return c == ' ' || c == '\t' || c == '\n' || c == '\r'; + }; + size_t real_begin = 0; + while (real_begin < ref.size() && is_ws(ref[real_begin])) { ++real_begin; } + size_t real_end = ref.size(); + while (real_end > real_begin && is_ws(ref[real_end - 1])) { --real_end; } + + return ref.substr(real_begin, real_end - real_begin); + } + + bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { + bool replaced = false; + std::size_t i = str.find( replaceThis ); + while( i != std::string::npos ) { + replaced = true; + str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); + if( i < str.size()-withThis.size() ) + i = str.find( replaceThis, i+withThis.size() ); + else + i = std::string::npos; + } + return replaced; + } + + std::vector<StringRef> splitStringRef( StringRef str, char delimiter ) { + std::vector<StringRef> subStrings; + std::size_t start = 0; + for(std::size_t pos = 0; pos < str.size(); ++pos ) { + if( str[pos] == delimiter ) { + if( pos - start > 1 ) + subStrings.push_back( str.substr( start, pos-start ) ); + start = pos+1; + } + } + if( start < str.size() ) + subStrings.push_back( str.substr( start, str.size()-start ) ); + return subStrings; + } + + pluralise::pluralise( std::size_t count, std::string const& label ) + : m_count( count ), + m_label( label ) + {} + + std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { + os << pluraliser.m_count << ' ' << pluraliser.m_label; + if( pluraliser.m_count != 1 ) + os << 's'; + return os; + } + +} +// end catch_string_manip.cpp +// start catch_stringref.cpp + +#include <algorithm> +#include <ostream> +#include <cstring> +#include <cstdint> + +namespace Catch { + StringRef::StringRef( char const* rawChars ) noexcept + : StringRef( rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars) ) ) + {} + + auto StringRef::c_str() const -> char const* { + CATCH_ENFORCE(isNullTerminated(), "Called StringRef::c_str() on a non-null-terminated instance"); + return m_start; + } + auto StringRef::data() const noexcept -> char const* { + return m_start; + } + + auto StringRef::substr( size_type start, size_type size ) const noexcept -> StringRef { + if (start < m_size) { + return StringRef(m_start + start, (std::min)(m_size - start, size)); + } else { + return StringRef(); + } + } + auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool { + return m_size == other.m_size + && (std::memcmp( m_start, other.m_start, m_size ) == 0); + } + + auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& { + return os.write(str.data(), str.size()); + } + + auto operator+=( std::string& lhs, StringRef const& rhs ) -> std::string& { + lhs.append(rhs.data(), rhs.size()); + return lhs; + } + +} // namespace Catch +// end catch_stringref.cpp +// start catch_tag_alias.cpp + +namespace Catch { + TagAlias::TagAlias(std::string const & _tag, SourceLineInfo _lineInfo): tag(_tag), lineInfo(_lineInfo) {} +} +// end catch_tag_alias.cpp +// start catch_tag_alias_autoregistrar.cpp + +namespace Catch { + + RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo) { + CATCH_TRY { + getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo); + } CATCH_CATCH_ALL { + // Do not throw when constructing global objects, instead register the exception to be processed later + getMutableRegistryHub().registerStartupException(); + } + } + +} +// end catch_tag_alias_autoregistrar.cpp +// start catch_tag_alias_registry.cpp + +#include <sstream> + +namespace Catch { + + TagAliasRegistry::~TagAliasRegistry() {} + + TagAlias const* TagAliasRegistry::find( std::string const& alias ) const { + auto it = m_registry.find( alias ); + if( it != m_registry.end() ) + return &(it->second); + else + return nullptr; + } + + std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { + std::string expandedTestSpec = unexpandedTestSpec; + for( auto const& registryKvp : m_registry ) { + std::size_t pos = expandedTestSpec.find( registryKvp.first ); + if( pos != std::string::npos ) { + expandedTestSpec = expandedTestSpec.substr( 0, pos ) + + registryKvp.second.tag + + expandedTestSpec.substr( pos + registryKvp.first.size() ); + } + } + return expandedTestSpec; + } + + void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) { + CATCH_ENFORCE( startsWith(alias, "[@") && endsWith(alias, ']'), + "error: tag alias, '" << alias << "' is not of the form [@alias name].\n" << lineInfo ); + + CATCH_ENFORCE( m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second, + "error: tag alias, '" << alias << "' already registered.\n" + << "\tFirst seen at: " << find(alias)->lineInfo << "\n" + << "\tRedefined at: " << lineInfo ); + } + + ITagAliasRegistry::~ITagAliasRegistry() {} + + ITagAliasRegistry const& ITagAliasRegistry::get() { + return getRegistryHub().getTagAliasRegistry(); + } + +} // end namespace Catch +// end catch_tag_alias_registry.cpp +// start catch_test_case_info.cpp + +#include <cctype> +#include <exception> +#include <algorithm> +#include <sstream> + +namespace Catch { + + namespace { + TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { + if( startsWith( tag, '.' ) || + tag == "!hide" ) + return TestCaseInfo::IsHidden; + else if( tag == "!throws" ) + return TestCaseInfo::Throws; + else if( tag == "!shouldfail" ) + return TestCaseInfo::ShouldFail; + else if( tag == "!mayfail" ) + return TestCaseInfo::MayFail; + else if( tag == "!nonportable" ) + return TestCaseInfo::NonPortable; + else if( tag == "!benchmark" ) + return static_cast<TestCaseInfo::SpecialProperties>( TestCaseInfo::Benchmark | TestCaseInfo::IsHidden ); + else + return TestCaseInfo::None; + } + bool isReservedTag( std::string const& tag ) { + return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( static_cast<unsigned char>(tag[0]) ); + } + void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { + CATCH_ENFORCE( !isReservedTag(tag), + "Tag name: [" << tag << "] is not allowed.\n" + << "Tag names starting with non alphanumeric characters are reserved\n" + << _lineInfo ); + } + } + + TestCase makeTestCase( ITestInvoker* _testCase, + std::string const& _className, + NameAndTags const& nameAndTags, + SourceLineInfo const& _lineInfo ) + { + bool isHidden = false; + + // Parse out tags + std::vector<std::string> tags; + std::string desc, tag; + bool inTag = false; + for (char c : nameAndTags.tags) { + if( !inTag ) { + if( c == '[' ) + inTag = true; + else + desc += c; + } + else { + if( c == ']' ) { + TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); + if( ( prop & TestCaseInfo::IsHidden ) != 0 ) + isHidden = true; + else if( prop == TestCaseInfo::None ) + enforceNotReservedTag( tag, _lineInfo ); + + // Merged hide tags like `[.approvals]` should be added as + // `[.][approvals]`. The `[.]` is added at later point, so + // we only strip the prefix + if (startsWith(tag, '.') && tag.size() > 1) { + tag.erase(0, 1); + } + tags.push_back( tag ); + tag.clear(); + inTag = false; + } + else + tag += c; + } + } + if( isHidden ) { + // Add all "hidden" tags to make them behave identically + tags.insert( tags.end(), { ".", "!hide" } ); + } + + TestCaseInfo info( static_cast<std::string>(nameAndTags.name), _className, desc, tags, _lineInfo ); + return TestCase( _testCase, std::move(info) ); + } + + void setTags( TestCaseInfo& testCaseInfo, std::vector<std::string> tags ) { + std::sort(begin(tags), end(tags)); + tags.erase(std::unique(begin(tags), end(tags)), end(tags)); + testCaseInfo.lcaseTags.clear(); + + for( auto const& tag : tags ) { + std::string lcaseTag = toLower( tag ); + testCaseInfo.properties = static_cast<TestCaseInfo::SpecialProperties>( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); + testCaseInfo.lcaseTags.push_back( lcaseTag ); + } + testCaseInfo.tags = std::move(tags); + } + + TestCaseInfo::TestCaseInfo( std::string const& _name, + std::string const& _className, + std::string const& _description, + std::vector<std::string> const& _tags, + SourceLineInfo const& _lineInfo ) + : name( _name ), + className( _className ), + description( _description ), + lineInfo( _lineInfo ), + properties( None ) + { + setTags( *this, _tags ); + } + + bool TestCaseInfo::isHidden() const { + return ( properties & IsHidden ) != 0; + } + bool TestCaseInfo::throws() const { + return ( properties & Throws ) != 0; + } + bool TestCaseInfo::okToFail() const { + return ( properties & (ShouldFail | MayFail ) ) != 0; + } + bool TestCaseInfo::expectedToFail() const { + return ( properties & (ShouldFail ) ) != 0; + } + + std::string TestCaseInfo::tagsAsString() const { + std::string ret; + // '[' and ']' per tag + std::size_t full_size = 2 * tags.size(); + for (const auto& tag : tags) { + full_size += tag.size(); + } + ret.reserve(full_size); + for (const auto& tag : tags) { + ret.push_back('['); + ret.append(tag); + ret.push_back(']'); + } + + return ret; + } + + TestCase::TestCase( ITestInvoker* testCase, TestCaseInfo&& info ) : TestCaseInfo( std::move(info) ), test( testCase ) {} + + TestCase TestCase::withName( std::string const& _newName ) const { + TestCase other( *this ); + other.name = _newName; + return other; + } + + void TestCase::invoke() const { + test->invoke(); + } + + bool TestCase::operator == ( TestCase const& other ) const { + return test.get() == other.test.get() && + name == other.name && + className == other.className; + } + + bool TestCase::operator < ( TestCase const& other ) const { + return name < other.name; + } + + TestCaseInfo const& TestCase::getTestCaseInfo() const + { + return *this; + } + +} // end namespace Catch +// end catch_test_case_info.cpp +// start catch_test_case_registry_impl.cpp + +#include <algorithm> +#include <sstream> + +namespace Catch { + + namespace { + struct TestHasher { + explicit TestHasher(Catch::SimplePcg32& rng_instance) { + basis = rng_instance(); + basis <<= 32; + basis |= rng_instance(); + } + + uint64_t basis; + + uint64_t operator()(TestCase const& t) const { + // Modified FNV-1a hash + static constexpr uint64_t prime = 1099511628211; + uint64_t hash = basis; + for (const char c : t.name) { + hash ^= c; + hash *= prime; + } + return hash; + } + }; + } // end unnamed namespace + + std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) { + switch( config.runOrder() ) { + case RunTests::InDeclarationOrder: + // already in declaration order + break; + + case RunTests::InLexicographicalOrder: { + std::vector<TestCase> sorted = unsortedTestCases; + std::sort( sorted.begin(), sorted.end() ); + return sorted; + } + + case RunTests::InRandomOrder: { + seedRng( config ); + TestHasher h( rng() ); + + using hashedTest = std::pair<uint64_t, TestCase const*>; + std::vector<hashedTest> indexed_tests; + indexed_tests.reserve( unsortedTestCases.size() ); + + for (auto const& testCase : unsortedTestCases) { + indexed_tests.emplace_back(h(testCase), &testCase); + } + + std::sort(indexed_tests.begin(), indexed_tests.end(), + [](hashedTest const& lhs, hashedTest const& rhs) { + if (lhs.first == rhs.first) { + return lhs.second->name < rhs.second->name; + } + return lhs.first < rhs.first; + }); + + std::vector<TestCase> sorted; + sorted.reserve( indexed_tests.size() ); + + for (auto const& hashed : indexed_tests) { + sorted.emplace_back(*hashed.second); + } + + return sorted; + } + } + return unsortedTestCases; + } + + bool isThrowSafe( TestCase const& testCase, IConfig const& config ) { + return !testCase.throws() || config.allowThrows(); + } + + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { + return testSpec.matches( testCase ) && isThrowSafe( testCase, config ); + } + + void enforceNoDuplicateTestCases( std::vector<TestCase> const& functions ) { + std::set<TestCase> seenFunctions; + for( auto const& function : functions ) { + auto prev = seenFunctions.insert( function ); + CATCH_ENFORCE( prev.second, + "error: TEST_CASE( \"" << function.name << "\" ) already defined.\n" + << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" + << "\tRedefined at " << function.getTestCaseInfo().lineInfo ); + } + } + + std::vector<TestCase> filterTests( std::vector<TestCase> const& testCases, TestSpec const& testSpec, IConfig const& config ) { + std::vector<TestCase> filtered; + filtered.reserve( testCases.size() ); + for (auto const& testCase : testCases) { + if ((!testSpec.hasFilters() && !testCase.isHidden()) || + (testSpec.hasFilters() && matchTest(testCase, testSpec, config))) { + filtered.push_back(testCase); + } + } + return filtered; + } + std::vector<TestCase> const& getAllTestCasesSorted( IConfig const& config ) { + return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); + } + + void TestRegistry::registerTest( TestCase const& testCase ) { + std::string name = testCase.getTestCaseInfo().name; + if( name.empty() ) { + ReusableStringStream rss; + rss << "Anonymous test case " << ++m_unnamedCount; + return registerTest( testCase.withName( rss.str() ) ); + } + m_functions.push_back( testCase ); + } + + std::vector<TestCase> const& TestRegistry::getAllTests() const { + return m_functions; + } + std::vector<TestCase> const& TestRegistry::getAllTestsSorted( IConfig const& config ) const { + if( m_sortedFunctions.empty() ) + enforceNoDuplicateTestCases( m_functions ); + + if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { + m_sortedFunctions = sortTests( config, m_functions ); + m_currentSortOrder = config.runOrder(); + } + return m_sortedFunctions; + } + + /////////////////////////////////////////////////////////////////////////// + TestInvokerAsFunction::TestInvokerAsFunction( void(*testAsFunction)() ) noexcept : m_testAsFunction( testAsFunction ) {} + + void TestInvokerAsFunction::invoke() const { + m_testAsFunction(); + } + + std::string extractClassName( StringRef const& classOrQualifiedMethodName ) { + std::string className(classOrQualifiedMethodName); + if( startsWith( className, '&' ) ) + { + std::size_t lastColons = className.rfind( "::" ); + std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); + if( penultimateColons == std::string::npos ) + penultimateColons = 1; + className = className.substr( penultimateColons, lastColons-penultimateColons ); + } + return className; + } + +} // end namespace Catch +// end catch_test_case_registry_impl.cpp +// start catch_test_case_tracker.cpp + +#include <algorithm> +#include <cassert> +#include <stdexcept> +#include <memory> +#include <sstream> + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wexit-time-destructors" +#endif + +namespace Catch { +namespace TestCaseTracking { + + NameAndLocation::NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) + : name( _name ), + location( _location ) + {} + + ITracker::~ITracker() = default; + + ITracker& TrackerContext::startRun() { + m_rootTracker = std::make_shared<SectionTracker>( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, nullptr ); + m_currentTracker = nullptr; + m_runState = Executing; + return *m_rootTracker; + } + + void TrackerContext::endRun() { + m_rootTracker.reset(); + m_currentTracker = nullptr; + m_runState = NotStarted; + } + + void TrackerContext::startCycle() { + m_currentTracker = m_rootTracker.get(); + m_runState = Executing; + } + void TrackerContext::completeCycle() { + m_runState = CompletedCycle; + } + + bool TrackerContext::completedCycle() const { + return m_runState == CompletedCycle; + } + ITracker& TrackerContext::currentTracker() { + return *m_currentTracker; + } + void TrackerContext::setCurrentTracker( ITracker* tracker ) { + m_currentTracker = tracker; + } + + TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ): + ITracker(nameAndLocation), + m_ctx( ctx ), + m_parent( parent ) + {} + + bool TrackerBase::isComplete() const { + return m_runState == CompletedSuccessfully || m_runState == Failed; + } + bool TrackerBase::isSuccessfullyCompleted() const { + return m_runState == CompletedSuccessfully; + } + bool TrackerBase::isOpen() const { + return m_runState != NotStarted && !isComplete(); + } + bool TrackerBase::hasChildren() const { + return !m_children.empty(); + } + + void TrackerBase::addChild( ITrackerPtr const& child ) { + m_children.push_back( child ); + } + + ITrackerPtr TrackerBase::findChild( NameAndLocation const& nameAndLocation ) { + auto it = std::find_if( m_children.begin(), m_children.end(), + [&nameAndLocation]( ITrackerPtr const& tracker ){ + return + tracker->nameAndLocation().location == nameAndLocation.location && + tracker->nameAndLocation().name == nameAndLocation.name; + } ); + return( it != m_children.end() ) + ? *it + : nullptr; + } + ITracker& TrackerBase::parent() { + assert( m_parent ); // Should always be non-null except for root + return *m_parent; + } + + void TrackerBase::openChild() { + if( m_runState != ExecutingChildren ) { + m_runState = ExecutingChildren; + if( m_parent ) + m_parent->openChild(); + } + } + + bool TrackerBase::isSectionTracker() const { return false; } + bool TrackerBase::isGeneratorTracker() const { return false; } + + void TrackerBase::open() { + m_runState = Executing; + moveToThis(); + if( m_parent ) + m_parent->openChild(); + } + + void TrackerBase::close() { + + // Close any still open children (e.g. generators) + while( &m_ctx.currentTracker() != this ) + m_ctx.currentTracker().close(); + + switch( m_runState ) { + case NeedsAnotherRun: + break; + + case Executing: + m_runState = CompletedSuccessfully; + break; + case ExecutingChildren: + if( std::all_of(m_children.begin(), m_children.end(), [](ITrackerPtr const& t){ return t->isComplete(); }) ) + m_runState = CompletedSuccessfully; + break; + + case NotStarted: + case CompletedSuccessfully: + case Failed: + CATCH_INTERNAL_ERROR( "Illogical state: " << m_runState ); + + default: + CATCH_INTERNAL_ERROR( "Unknown state: " << m_runState ); + } + moveToParent(); + m_ctx.completeCycle(); + } + void TrackerBase::fail() { + m_runState = Failed; + if( m_parent ) + m_parent->markAsNeedingAnotherRun(); + moveToParent(); + m_ctx.completeCycle(); + } + void TrackerBase::markAsNeedingAnotherRun() { + m_runState = NeedsAnotherRun; + } + + void TrackerBase::moveToParent() { + assert( m_parent ); + m_ctx.setCurrentTracker( m_parent ); + } + void TrackerBase::moveToThis() { + m_ctx.setCurrentTracker( this ); + } + + SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) + : TrackerBase( nameAndLocation, ctx, parent ), + m_trimmed_name(trim(nameAndLocation.name)) + { + if( parent ) { + while( !parent->isSectionTracker() ) + parent = &parent->parent(); + + SectionTracker& parentSection = static_cast<SectionTracker&>( *parent ); + addNextFilters( parentSection.m_filters ); + } + } + + bool SectionTracker::isComplete() const { + bool complete = true; + + if (m_filters.empty() + || m_filters[0] == "" + || std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) { + complete = TrackerBase::isComplete(); + } + return complete; + } + + bool SectionTracker::isSectionTracker() const { return true; } + + SectionTracker& SectionTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { + std::shared_ptr<SectionTracker> section; + + ITracker& currentTracker = ctx.currentTracker(); + if( ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { + assert( childTracker ); + assert( childTracker->isSectionTracker() ); + section = std::static_pointer_cast<SectionTracker>( childTracker ); + } + else { + section = std::make_shared<SectionTracker>( nameAndLocation, ctx, ¤tTracker ); + currentTracker.addChild( section ); + } + if( !ctx.completedCycle() ) + section->tryOpen(); + return *section; + } + + void SectionTracker::tryOpen() { + if( !isComplete() ) + open(); + } + + void SectionTracker::addInitialFilters( std::vector<std::string> const& filters ) { + if( !filters.empty() ) { + m_filters.reserve( m_filters.size() + filters.size() + 2 ); + m_filters.emplace_back(""); // Root - should never be consulted + m_filters.emplace_back(""); // Test Case - not a section filter + m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); + } + } + void SectionTracker::addNextFilters( std::vector<std::string> const& filters ) { + if( filters.size() > 1 ) + m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() ); + } + + std::vector<std::string> const& SectionTracker::getFilters() const { + return m_filters; + } + + std::string const& SectionTracker::trimmedName() const { + return m_trimmed_name; + } + +} // namespace TestCaseTracking + +using TestCaseTracking::ITracker; +using TestCaseTracking::TrackerContext; +using TestCaseTracking::SectionTracker; + +} // namespace Catch + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif +// end catch_test_case_tracker.cpp +// start catch_test_registry.cpp + +namespace Catch { + + auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker* { + return new(std::nothrow) TestInvokerAsFunction( testAsFunction ); + } + + NameAndTags::NameAndTags( StringRef const& name_ , StringRef const& tags_ ) noexcept : name( name_ ), tags( tags_ ) {} + + AutoReg::AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept { + CATCH_TRY { + getMutableRegistryHub() + .registerTest( + makeTestCase( + invoker, + extractClassName( classOrMethod ), + nameAndTags, + lineInfo)); + } CATCH_CATCH_ALL { + // Do not throw when constructing global objects, instead register the exception to be processed later + getMutableRegistryHub().registerStartupException(); + } + } + + AutoReg::~AutoReg() = default; +} +// end catch_test_registry.cpp +// start catch_test_spec.cpp + +#include <algorithm> +#include <string> +#include <vector> +#include <memory> + +namespace Catch { + + TestSpec::Pattern::Pattern( std::string const& name ) + : m_name( name ) + {} + + TestSpec::Pattern::~Pattern() = default; + + std::string const& TestSpec::Pattern::name() const { + return m_name; + } + + TestSpec::NamePattern::NamePattern( std::string const& name, std::string const& filterString ) + : Pattern( filterString ) + , m_wildcardPattern( toLower( name ), CaseSensitive::No ) + {} + + bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const { + return m_wildcardPattern.matches( testCase.name ); + } + + TestSpec::TagPattern::TagPattern( std::string const& tag, std::string const& filterString ) + : Pattern( filterString ) + , m_tag( toLower( tag ) ) + {} + + bool TestSpec::TagPattern::matches( TestCaseInfo const& testCase ) const { + return std::find(begin(testCase.lcaseTags), + end(testCase.lcaseTags), + m_tag) != end(testCase.lcaseTags); + } + + TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern ) + : Pattern( underlyingPattern->name() ) + , m_underlyingPattern( underlyingPattern ) + {} + + bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const { + return !m_underlyingPattern->matches( testCase ); + } + + bool TestSpec::Filter::matches( TestCaseInfo const& testCase ) const { + return std::all_of( m_patterns.begin(), m_patterns.end(), [&]( PatternPtr const& p ){ return p->matches( testCase ); } ); + } + + std::string TestSpec::Filter::name() const { + std::string name; + for( auto const& p : m_patterns ) + name += p->name(); + return name; + } + + bool TestSpec::hasFilters() const { + return !m_filters.empty(); + } + + bool TestSpec::matches( TestCaseInfo const& testCase ) const { + return std::any_of( m_filters.begin(), m_filters.end(), [&]( Filter const& f ){ return f.matches( testCase ); } ); + } + + TestSpec::Matches TestSpec::matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const + { + Matches matches( m_filters.size() ); + std::transform( m_filters.begin(), m_filters.end(), matches.begin(), [&]( Filter const& filter ){ + std::vector<TestCase const*> currentMatches; + for( auto const& test : testCases ) + if( isThrowSafe( test, config ) && filter.matches( test ) ) + currentMatches.emplace_back( &test ); + return FilterMatch{ filter.name(), currentMatches }; + } ); + return matches; + } + + const TestSpec::vectorStrings& TestSpec::getInvalidArgs() const{ + return (m_invalidArgs); + } + +} +// end catch_test_spec.cpp +// start catch_test_spec_parser.cpp + +namespace Catch { + + TestSpecParser::TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} + + TestSpecParser& TestSpecParser::parse( std::string const& arg ) { + m_mode = None; + m_exclusion = false; + m_arg = m_tagAliases->expandAliases( arg ); + m_escapeChars.clear(); + m_substring.reserve(m_arg.size()); + m_patternName.reserve(m_arg.size()); + m_realPatternPos = 0; + + for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) + //if visitChar fails + if( !visitChar( m_arg[m_pos] ) ){ + m_testSpec.m_invalidArgs.push_back(arg); + break; + } + endMode(); + return *this; + } + TestSpec TestSpecParser::testSpec() { + addFilter(); + return m_testSpec; + } + bool TestSpecParser::visitChar( char c ) { + if( (m_mode != EscapedName) && (c == '\\') ) { + escape(); + addCharToPattern(c); + return true; + }else if((m_mode != EscapedName) && (c == ',') ) { + return separate(); + } + + switch( m_mode ) { + case None: + if( processNoneChar( c ) ) + return true; + break; + case Name: + processNameChar( c ); + break; + case EscapedName: + endMode(); + addCharToPattern(c); + return true; + default: + case Tag: + case QuotedName: + if( processOtherChar( c ) ) + return true; + break; + } + + m_substring += c; + if( !isControlChar( c ) ) { + m_patternName += c; + m_realPatternPos++; + } + return true; + } + // Two of the processing methods return true to signal the caller to return + // without adding the given character to the current pattern strings + bool TestSpecParser::processNoneChar( char c ) { + switch( c ) { + case ' ': + return true; + case '~': + m_exclusion = true; + return false; + case '[': + startNewMode( Tag ); + return false; + case '"': + startNewMode( QuotedName ); + return false; + default: + startNewMode( Name ); + return false; + } + } + void TestSpecParser::processNameChar( char c ) { + if( c == '[' ) { + if( m_substring == "exclude:" ) + m_exclusion = true; + else + endMode(); + startNewMode( Tag ); + } + } + bool TestSpecParser::processOtherChar( char c ) { + if( !isControlChar( c ) ) + return false; + m_substring += c; + endMode(); + return true; + } + void TestSpecParser::startNewMode( Mode mode ) { + m_mode = mode; + } + void TestSpecParser::endMode() { + switch( m_mode ) { + case Name: + case QuotedName: + return addNamePattern(); + case Tag: + return addTagPattern(); + case EscapedName: + revertBackToLastMode(); + return; + case None: + default: + return startNewMode( None ); + } + } + void TestSpecParser::escape() { + saveLastMode(); + m_mode = EscapedName; + m_escapeChars.push_back(m_realPatternPos); + } + bool TestSpecParser::isControlChar( char c ) const { + switch( m_mode ) { + default: + return false; + case None: + return c == '~'; + case Name: + return c == '['; + case EscapedName: + return true; + case QuotedName: + return c == '"'; + case Tag: + return c == '[' || c == ']'; + } + } + + void TestSpecParser::addFilter() { + if( !m_currentFilter.m_patterns.empty() ) { + m_testSpec.m_filters.push_back( m_currentFilter ); + m_currentFilter = TestSpec::Filter(); + } + } + + void TestSpecParser::saveLastMode() { + lastMode = m_mode; + } + + void TestSpecParser::revertBackToLastMode() { + m_mode = lastMode; + } + + bool TestSpecParser::separate() { + if( (m_mode==QuotedName) || (m_mode==Tag) ){ + //invalid argument, signal failure to previous scope. + m_mode = None; + m_pos = m_arg.size(); + m_substring.clear(); + m_patternName.clear(); + m_realPatternPos = 0; + return false; + } + endMode(); + addFilter(); + return true; //success + } + + std::string TestSpecParser::preprocessPattern() { + std::string token = m_patternName; + for (std::size_t i = 0; i < m_escapeChars.size(); ++i) + token = token.substr(0, m_escapeChars[i] - i) + token.substr(m_escapeChars[i] - i + 1); + m_escapeChars.clear(); + if (startsWith(token, "exclude:")) { + m_exclusion = true; + token = token.substr(8); + } + + m_patternName.clear(); + m_realPatternPos = 0; + + return token; + } + + void TestSpecParser::addNamePattern() { + auto token = preprocessPattern(); + + if (!token.empty()) { + TestSpec::PatternPtr pattern = std::make_shared<TestSpec::NamePattern>(token, m_substring); + if (m_exclusion) + pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern); + m_currentFilter.m_patterns.push_back(pattern); + } + m_substring.clear(); + m_exclusion = false; + m_mode = None; + } + + void TestSpecParser::addTagPattern() { + auto token = preprocessPattern(); + + if (!token.empty()) { + // If the tag pattern is the "hide and tag" shorthand (e.g. [.foo]) + // we have to create a separate hide tag and shorten the real one + if (token.size() > 1 && token[0] == '.') { + token.erase(token.begin()); + TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(".", m_substring); + if (m_exclusion) { + pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern); + } + m_currentFilter.m_patterns.push_back(pattern); + } + + TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(token, m_substring); + + if (m_exclusion) { + pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern); + } + m_currentFilter.m_patterns.push_back(pattern); + } + m_substring.clear(); + m_exclusion = false; + m_mode = None; + } + + TestSpec parseTestSpec( std::string const& arg ) { + return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); + } + +} // namespace Catch +// end catch_test_spec_parser.cpp +// start catch_timer.cpp + +#include <chrono> + +static const uint64_t nanosecondsInSecond = 1000000000; + +namespace Catch { + + auto getCurrentNanosecondsSinceEpoch() -> uint64_t { + return std::chrono::duration_cast<std::chrono::nanoseconds>( std::chrono::high_resolution_clock::now().time_since_epoch() ).count(); + } + + namespace { + auto estimateClockResolution() -> uint64_t { + uint64_t sum = 0; + static const uint64_t iterations = 1000000; + + auto startTime = getCurrentNanosecondsSinceEpoch(); + + for( std::size_t i = 0; i < iterations; ++i ) { + + uint64_t ticks; + uint64_t baseTicks = getCurrentNanosecondsSinceEpoch(); + do { + ticks = getCurrentNanosecondsSinceEpoch(); + } while( ticks == baseTicks ); + + auto delta = ticks - baseTicks; + sum += delta; + + // If we have been calibrating for over 3 seconds -- the clock + // is terrible and we should move on. + // TBD: How to signal that the measured resolution is probably wrong? + if (ticks > startTime + 3 * nanosecondsInSecond) { + return sum / ( i + 1u ); + } + } + + // We're just taking the mean, here. To do better we could take the std. dev and exclude outliers + // - and potentially do more iterations if there's a high variance. + return sum/iterations; + } + } + auto getEstimatedClockResolution() -> uint64_t { + static auto s_resolution = estimateClockResolution(); + return s_resolution; + } + + void Timer::start() { + m_nanoseconds = getCurrentNanosecondsSinceEpoch(); + } + auto Timer::getElapsedNanoseconds() const -> uint64_t { + return getCurrentNanosecondsSinceEpoch() - m_nanoseconds; + } + auto Timer::getElapsedMicroseconds() const -> uint64_t { + return getElapsedNanoseconds()/1000; + } + auto Timer::getElapsedMilliseconds() const -> unsigned int { + return static_cast<unsigned int>(getElapsedMicroseconds()/1000); + } + auto Timer::getElapsedSeconds() const -> double { + return getElapsedMicroseconds()/1000000.0; + } + +} // namespace Catch +// end catch_timer.cpp +// start catch_tostring.cpp + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wexit-time-destructors" +# pragma clang diagnostic ignored "-Wglobal-constructors" +#endif + +// Enable specific decls locally +#if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) +#define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER +#endif + +#include <cmath> +#include <iomanip> + +namespace Catch { + +namespace Detail { + + const std::string unprintableString = "{?}"; + + namespace { + const int hexThreshold = 255; + + struct Endianness { + enum Arch { Big, Little }; + + static Arch which() { + int one = 1; + // If the lowest byte we read is non-zero, we can assume + // that little endian format is used. + auto value = *reinterpret_cast<char*>(&one); + return value ? Little : Big; + } + }; + } + + std::string rawMemoryToString( const void *object, std::size_t size ) { + // Reverse order for little endian architectures + int i = 0, end = static_cast<int>( size ), inc = 1; + if( Endianness::which() == Endianness::Little ) { + i = end-1; + end = inc = -1; + } + + unsigned char const *bytes = static_cast<unsigned char const *>(object); + ReusableStringStream rss; + rss << "0x" << std::setfill('0') << std::hex; + for( ; i != end; i += inc ) + rss << std::setw(2) << static_cast<unsigned>(bytes[i]); + return rss.str(); + } +} + +template<typename T> +std::string fpToString( T value, int precision ) { + if (Catch::isnan(value)) { + return "nan"; + } + + ReusableStringStream rss; + rss << std::setprecision( precision ) + << std::fixed + << value; + std::string d = rss.str(); + std::size_t i = d.find_last_not_of( '0' ); + if( i != std::string::npos && i != d.size()-1 ) { + if( d[i] == '.' ) + i++; + d = d.substr( 0, i+1 ); + } + return d; +} + +//// ======================================================= //// +// +// Out-of-line defs for full specialization of StringMaker +// +//// ======================================================= //// + +std::string StringMaker<std::string>::convert(const std::string& str) { + if (!getCurrentContext().getConfig()->showInvisibles()) { + return '"' + str + '"'; + } + + std::string s("\""); + for (char c : str) { + switch (c) { + case '\n': + s.append("\\n"); + break; + case '\t': + s.append("\\t"); + break; + default: + s.push_back(c); + break; + } + } + s.append("\""); + return s; +} + +#ifdef CATCH_CONFIG_CPP17_STRING_VIEW +std::string StringMaker<std::string_view>::convert(std::string_view str) { + return ::Catch::Detail::stringify(std::string{ str }); +} +#endif + +std::string StringMaker<char const*>::convert(char const* str) { + if (str) { + return ::Catch::Detail::stringify(std::string{ str }); + } else { + return{ "{null string}" }; + } +} +std::string StringMaker<char*>::convert(char* str) { + if (str) { + return ::Catch::Detail::stringify(std::string{ str }); + } else { + return{ "{null string}" }; + } +} + +#ifdef CATCH_CONFIG_WCHAR +std::string StringMaker<std::wstring>::convert(const std::wstring& wstr) { + std::string s; + s.reserve(wstr.size()); + for (auto c : wstr) { + s += (c <= 0xff) ? static_cast<char>(c) : '?'; + } + return ::Catch::Detail::stringify(s); +} + +# ifdef CATCH_CONFIG_CPP17_STRING_VIEW +std::string StringMaker<std::wstring_view>::convert(std::wstring_view str) { + return StringMaker<std::wstring>::convert(std::wstring(str)); +} +# endif + +std::string StringMaker<wchar_t const*>::convert(wchar_t const * str) { + if (str) { + return ::Catch::Detail::stringify(std::wstring{ str }); + } else { + return{ "{null string}" }; + } +} +std::string StringMaker<wchar_t *>::convert(wchar_t * str) { + if (str) { + return ::Catch::Detail::stringify(std::wstring{ str }); + } else { + return{ "{null string}" }; + } +} +#endif + +#if defined(CATCH_CONFIG_CPP17_BYTE) +#include <cstddef> +std::string StringMaker<std::byte>::convert(std::byte value) { + return ::Catch::Detail::stringify(std::to_integer<unsigned long long>(value)); +} +#endif // defined(CATCH_CONFIG_CPP17_BYTE) + +std::string StringMaker<int>::convert(int value) { + return ::Catch::Detail::stringify(static_cast<long long>(value)); +} +std::string StringMaker<long>::convert(long value) { + return ::Catch::Detail::stringify(static_cast<long long>(value)); +} +std::string StringMaker<long long>::convert(long long value) { + ReusableStringStream rss; + rss << value; + if (value > Detail::hexThreshold) { + rss << " (0x" << std::hex << value << ')'; + } + return rss.str(); +} + +std::string StringMaker<unsigned int>::convert(unsigned int value) { + return ::Catch::Detail::stringify(static_cast<unsigned long long>(value)); +} +std::string StringMaker<unsigned long>::convert(unsigned long value) { + return ::Catch::Detail::stringify(static_cast<unsigned long long>(value)); +} +std::string StringMaker<unsigned long long>::convert(unsigned long long value) { + ReusableStringStream rss; + rss << value; + if (value > Detail::hexThreshold) { + rss << " (0x" << std::hex << value << ')'; + } + return rss.str(); +} + +std::string StringMaker<bool>::convert(bool b) { + return b ? "true" : "false"; +} + +std::string StringMaker<signed char>::convert(signed char value) { + if (value == '\r') { + return "'\\r'"; + } else if (value == '\f') { + return "'\\f'"; + } else if (value == '\n') { + return "'\\n'"; + } else if (value == '\t') { + return "'\\t'"; + } else if ('\0' <= value && value < ' ') { + return ::Catch::Detail::stringify(static_cast<unsigned int>(value)); + } else { + char chstr[] = "' '"; + chstr[1] = value; + return chstr; + } +} +std::string StringMaker<char>::convert(char c) { + return ::Catch::Detail::stringify(static_cast<signed char>(c)); +} +std::string StringMaker<unsigned char>::convert(unsigned char c) { + return ::Catch::Detail::stringify(static_cast<char>(c)); +} + +std::string StringMaker<std::nullptr_t>::convert(std::nullptr_t) { + return "nullptr"; +} + +int StringMaker<float>::precision = 5; + +std::string StringMaker<float>::convert(float value) { + return fpToString(value, precision) + 'f'; +} + +int StringMaker<double>::precision = 10; + +std::string StringMaker<double>::convert(double value) { + return fpToString(value, precision); +} + +std::string ratio_string<std::atto>::symbol() { return "a"; } +std::string ratio_string<std::femto>::symbol() { return "f"; } +std::string ratio_string<std::pico>::symbol() { return "p"; } +std::string ratio_string<std::nano>::symbol() { return "n"; } +std::string ratio_string<std::micro>::symbol() { return "u"; } +std::string ratio_string<std::milli>::symbol() { return "m"; } + +} // end namespace Catch + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + +// end catch_tostring.cpp +// start catch_totals.cpp + +namespace Catch { + + Counts Counts::operator - ( Counts const& other ) const { + Counts diff; + diff.passed = passed - other.passed; + diff.failed = failed - other.failed; + diff.failedButOk = failedButOk - other.failedButOk; + return diff; + } + + Counts& Counts::operator += ( Counts const& other ) { + passed += other.passed; + failed += other.failed; + failedButOk += other.failedButOk; + return *this; + } + + std::size_t Counts::total() const { + return passed + failed + failedButOk; + } + bool Counts::allPassed() const { + return failed == 0 && failedButOk == 0; + } + bool Counts::allOk() const { + return failed == 0; + } + + Totals Totals::operator - ( Totals const& other ) const { + Totals diff; + diff.assertions = assertions - other.assertions; + diff.testCases = testCases - other.testCases; + return diff; + } + + Totals& Totals::operator += ( Totals const& other ) { + assertions += other.assertions; + testCases += other.testCases; + return *this; + } + + Totals Totals::delta( Totals const& prevTotals ) const { + Totals diff = *this - prevTotals; + if( diff.assertions.failed > 0 ) + ++diff.testCases.failed; + else if( diff.assertions.failedButOk > 0 ) + ++diff.testCases.failedButOk; + else + ++diff.testCases.passed; + return diff; + } + +} +// end catch_totals.cpp +// start catch_uncaught_exceptions.cpp + +// start catch_config_uncaught_exceptions.hpp + +// Copyright Catch2 Authors +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// https://www.boost.org/LICENSE_1_0.txt) + +// SPDX-License-Identifier: BSL-1.0 + +#ifndef CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP +#define CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP + +#if defined(_MSC_VER) +# if _MSC_VER >= 1900 // Visual Studio 2015 or newer +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +# endif +#endif + +#include <exception> + +#if defined(__cpp_lib_uncaught_exceptions) \ + && !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + +# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif // __cpp_lib_uncaught_exceptions + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) \ + && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) \ + && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + +# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS +#endif + +#endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP +// end catch_config_uncaught_exceptions.hpp +#include <exception> + +namespace Catch { + bool uncaught_exceptions() { +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) + return false; +#elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) + return std::uncaught_exceptions() > 0; +#else + return std::uncaught_exception(); +#endif + } +} // end namespace Catch +// end catch_uncaught_exceptions.cpp +// start catch_version.cpp + +#include <ostream> + +namespace Catch { + + Version::Version + ( unsigned int _majorVersion, + unsigned int _minorVersion, + unsigned int _patchNumber, + char const * const _branchName, + unsigned int _buildNumber ) + : majorVersion( _majorVersion ), + minorVersion( _minorVersion ), + patchNumber( _patchNumber ), + branchName( _branchName ), + buildNumber( _buildNumber ) + {} + + std::ostream& operator << ( std::ostream& os, Version const& version ) { + os << version.majorVersion << '.' + << version.minorVersion << '.' + << version.patchNumber; + // branchName is never null -> 0th char is \0 if it is empty + if (version.branchName[0]) { + os << '-' << version.branchName + << '.' << version.buildNumber; + } + return os; + } + + Version const& libraryVersion() { + static Version version( 2, 13, 3, "", 0 ); + return version; + } + +} +// end catch_version.cpp +// start catch_wildcard_pattern.cpp + +namespace Catch { + + WildcardPattern::WildcardPattern( std::string const& pattern, + CaseSensitive::Choice caseSensitivity ) + : m_caseSensitivity( caseSensitivity ), + m_pattern( normaliseString( pattern ) ) + { + if( startsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 1 ); + m_wildcard = WildcardAtStart; + } + if( endsWith( m_pattern, '*' ) ) { + m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); + m_wildcard = static_cast<WildcardPosition>( m_wildcard | WildcardAtEnd ); + } + } + + bool WildcardPattern::matches( std::string const& str ) const { + switch( m_wildcard ) { + case NoWildcard: + return m_pattern == normaliseString( str ); + case WildcardAtStart: + return endsWith( normaliseString( str ), m_pattern ); + case WildcardAtEnd: + return startsWith( normaliseString( str ), m_pattern ); + case WildcardAtBothEnds: + return contains( normaliseString( str ), m_pattern ); + default: + CATCH_INTERNAL_ERROR( "Unknown enum" ); + } + } + + std::string WildcardPattern::normaliseString( std::string const& str ) const { + return trim( m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str ); + } +} +// end catch_wildcard_pattern.cpp +// start catch_xmlwriter.cpp + +#include <iomanip> +#include <type_traits> + +namespace Catch { + +namespace { + + size_t trailingBytes(unsigned char c) { + if ((c & 0xE0) == 0xC0) { + return 2; + } + if ((c & 0xF0) == 0xE0) { + return 3; + } + if ((c & 0xF8) == 0xF0) { + return 4; + } + CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); + } + + uint32_t headerValue(unsigned char c) { + if ((c & 0xE0) == 0xC0) { + return c & 0x1F; + } + if ((c & 0xF0) == 0xE0) { + return c & 0x0F; + } + if ((c & 0xF8) == 0xF0) { + return c & 0x07; + } + CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); + } + + void hexEscapeChar(std::ostream& os, unsigned char c) { + std::ios_base::fmtflags f(os.flags()); + os << "\\x" + << std::uppercase << std::hex << std::setfill('0') << std::setw(2) + << static_cast<int>(c); + os.flags(f); + } + + bool shouldNewline(XmlFormatting fmt) { + return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Newline)); + } + + bool shouldIndent(XmlFormatting fmt) { + return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Indent)); + } + +} // anonymous namespace + + XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) { + return static_cast<XmlFormatting>( + static_cast<std::underlying_type<XmlFormatting>::type>(lhs) | + static_cast<std::underlying_type<XmlFormatting>::type>(rhs) + ); + } + + XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) { + return static_cast<XmlFormatting>( + static_cast<std::underlying_type<XmlFormatting>::type>(lhs) & + static_cast<std::underlying_type<XmlFormatting>::type>(rhs) + ); + } + + XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat ) + : m_str( str ), + m_forWhat( forWhat ) + {} + + void XmlEncode::encodeTo( std::ostream& os ) const { + // Apostrophe escaping not necessary if we always use " to write attributes + // (see: http://www.w3.org/TR/xml/#syntax) + + for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) { + unsigned char c = m_str[idx]; + switch (c) { + case '<': os << "<"; break; + case '&': os << "&"; break; + + case '>': + // See: http://www.w3.org/TR/xml/#syntax + if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']') + os << ">"; + else + os << c; + break; + + case '\"': + if (m_forWhat == ForAttributes) + os << """; + else + os << c; + break; + + default: + // Check for control characters and invalid utf-8 + + // Escape control characters in standard ascii + // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 + if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) { + hexEscapeChar(os, c); + break; + } + + // Plain ASCII: Write it to stream + if (c < 0x7F) { + os << c; + break; + } + + // UTF-8 territory + // Check if the encoding is valid and if it is not, hex escape bytes. + // Important: We do not check the exact decoded values for validity, only the encoding format + // First check that this bytes is a valid lead byte: + // This means that it is not encoded as 1111 1XXX + // Or as 10XX XXXX + if (c < 0xC0 || + c >= 0xF8) { + hexEscapeChar(os, c); + break; + } + + auto encBytes = trailingBytes(c); + // Are there enough bytes left to avoid accessing out-of-bounds memory? + if (idx + encBytes - 1 >= m_str.size()) { + hexEscapeChar(os, c); + break; + } + // The header is valid, check data + // The next encBytes bytes must together be a valid utf-8 + // This means: bitpattern 10XX XXXX and the extracted value is sane (ish) + bool valid = true; + uint32_t value = headerValue(c); + for (std::size_t n = 1; n < encBytes; ++n) { + unsigned char nc = m_str[idx + n]; + valid &= ((nc & 0xC0) == 0x80); + value = (value << 6) | (nc & 0x3F); + } + + if ( + // Wrong bit pattern of following bytes + (!valid) || + // Overlong encodings + (value < 0x80) || + (0x80 <= value && value < 0x800 && encBytes > 2) || + (0x800 < value && value < 0x10000 && encBytes > 3) || + // Encoded value out of range + (value >= 0x110000) + ) { + hexEscapeChar(os, c); + break; + } + + // If we got here, this is in fact a valid(ish) utf-8 sequence + for (std::size_t n = 0; n < encBytes; ++n) { + os << m_str[idx + n]; + } + idx += encBytes - 1; + break; + } + } + } + + std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { + xmlEncode.encodeTo( os ); + return os; + } + + XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer, XmlFormatting fmt ) + : m_writer( writer ), + m_fmt(fmt) + {} + + XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept + : m_writer( other.m_writer ), + m_fmt(other.m_fmt) + { + other.m_writer = nullptr; + other.m_fmt = XmlFormatting::None; + } + XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) noexcept { + if ( m_writer ) { + m_writer->endElement(); + } + m_writer = other.m_writer; + other.m_writer = nullptr; + m_fmt = other.m_fmt; + other.m_fmt = XmlFormatting::None; + return *this; + } + + XmlWriter::ScopedElement::~ScopedElement() { + if (m_writer) { + m_writer->endElement(m_fmt); + } + } + + XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, XmlFormatting fmt ) { + m_writer->writeText( text, fmt ); + return *this; + } + + XmlWriter::XmlWriter( std::ostream& os ) : m_os( os ) + { + writeDeclaration(); + } + + XmlWriter::~XmlWriter() { + while (!m_tags.empty()) { + endElement(); + } + newlineIfNecessary(); + } + + XmlWriter& XmlWriter::startElement( std::string const& name, XmlFormatting fmt ) { + ensureTagClosed(); + newlineIfNecessary(); + if (shouldIndent(fmt)) { + m_os << m_indent; + m_indent += " "; + } + m_os << '<' << name; + m_tags.push_back( name ); + m_tagIsOpen = true; + applyFormatting(fmt); + return *this; + } + + XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name, XmlFormatting fmt ) { + ScopedElement scoped( this, fmt ); + startElement( name, fmt ); + return scoped; + } + + XmlWriter& XmlWriter::endElement(XmlFormatting fmt) { + m_indent = m_indent.substr(0, m_indent.size() - 2); + + if( m_tagIsOpen ) { + m_os << "/>"; + m_tagIsOpen = false; + } else { + newlineIfNecessary(); + if (shouldIndent(fmt)) { + m_os << m_indent; + } + m_os << "</" << m_tags.back() << ">"; + } + m_os << std::flush; + applyFormatting(fmt); + m_tags.pop_back(); + return *this; + } + + XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) { + if( !name.empty() && !attribute.empty() ) + m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"'; + return *this; + } + + XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) { + m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"'; + return *this; + } + + XmlWriter& XmlWriter::writeText( std::string const& text, XmlFormatting fmt) { + if( !text.empty() ){ + bool tagWasOpen = m_tagIsOpen; + ensureTagClosed(); + if (tagWasOpen && shouldIndent(fmt)) { + m_os << m_indent; + } + m_os << XmlEncode( text ); + applyFormatting(fmt); + } + return *this; + } + + XmlWriter& XmlWriter::writeComment( std::string const& text, XmlFormatting fmt) { + ensureTagClosed(); + if (shouldIndent(fmt)) { + m_os << m_indent; + } + m_os << "<!--" << text << "-->"; + applyFormatting(fmt); + return *this; + } + + void XmlWriter::writeStylesheetRef( std::string const& url ) { + m_os << "<?xml-stylesheet type=\"text/xsl\" href=\"" << url << "\"?>\n"; + } + + XmlWriter& XmlWriter::writeBlankLine() { + ensureTagClosed(); + m_os << '\n'; + return *this; + } + + void XmlWriter::ensureTagClosed() { + if( m_tagIsOpen ) { + m_os << '>' << std::flush; + newlineIfNecessary(); + m_tagIsOpen = false; + } + } + + void XmlWriter::applyFormatting(XmlFormatting fmt) { + m_needsNewline = shouldNewline(fmt); + } + + void XmlWriter::writeDeclaration() { + m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + } + + void XmlWriter::newlineIfNecessary() { + if( m_needsNewline ) { + m_os << std::endl; + m_needsNewline = false; + } + } +} +// end catch_xmlwriter.cpp +// start catch_reporter_bases.cpp + +#include <cstring> +#include <cfloat> +#include <cstdio> +#include <cassert> +#include <memory> + +namespace Catch { + void prepareExpandedExpression(AssertionResult& result) { + result.getExpandedExpression(); + } + + // Because formatting using c++ streams is stateful, drop down to C is required + // Alternatively we could use stringstream, but its performance is... not good. + std::string getFormattedDuration( double duration ) { + // Max exponent + 1 is required to represent the whole part + // + 1 for decimal point + // + 3 for the 3 decimal places + // + 1 for null terminator + const std::size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1; + char buffer[maxDoubleSize]; + + // Save previous errno, to prevent sprintf from overwriting it + ErrnoGuard guard; +#ifdef _MSC_VER + sprintf_s(buffer, "%.3f", duration); +#else + std::sprintf(buffer, "%.3f", duration); +#endif + return std::string(buffer); + } + + bool shouldShowDuration( IConfig const& config, double duration ) { + if ( config.showDurations() == ShowDurations::Always ) { + return true; + } + if ( config.showDurations() == ShowDurations::Never ) { + return false; + } + const double min = config.minDuration(); + return min >= 0 && duration >= min; + } + + std::string serializeFilters( std::vector<std::string> const& container ) { + ReusableStringStream oss; + bool first = true; + for (auto&& filter : container) + { + if (!first) + oss << ' '; + else + first = false; + + oss << filter; + } + return oss.str(); + } + + TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config) + :StreamingReporterBase(_config) {} + + std::set<Verbosity> TestEventListenerBase::getSupportedVerbosities() { + return { Verbosity::Quiet, Verbosity::Normal, Verbosity::High }; + } + + void TestEventListenerBase::assertionStarting(AssertionInfo const &) {} + + bool TestEventListenerBase::assertionEnded(AssertionStats const &) { + return false; + } + +} // end namespace Catch +// end catch_reporter_bases.cpp +// start catch_reporter_compact.cpp + +namespace { + +#ifdef CATCH_PLATFORM_MAC + const char* failedString() { return "FAILED"; } + const char* passedString() { return "PASSED"; } +#else + const char* failedString() { return "failed"; } + const char* passedString() { return "passed"; } +#endif + + // Colour::LightGrey + Catch::Colour::Code dimColour() { return Catch::Colour::FileName; } + + std::string bothOrAll( std::size_t count ) { + return count == 1 ? std::string() : + count == 2 ? "both " : "all " ; + } + +} // anon namespace + +namespace Catch { +namespace { +// Colour, message variants: +// - white: No tests ran. +// - red: Failed [both/all] N test cases, failed [both/all] M assertions. +// - white: Passed [both/all] N test cases (no assertions). +// - red: Failed N tests cases, failed M assertions. +// - green: Passed [both/all] N tests cases with M assertions. +void printTotals(std::ostream& out, const Totals& totals) { + if (totals.testCases.total() == 0) { + out << "No tests ran."; + } else if (totals.testCases.failed == totals.testCases.total()) { + Colour colour(Colour::ResultError); + const std::string qualify_assertions_failed = + totals.assertions.failed == totals.assertions.total() ? + bothOrAll(totals.assertions.failed) : std::string(); + out << + "Failed " << bothOrAll(totals.testCases.failed) + << pluralise(totals.testCases.failed, "test case") << ", " + "failed " << qualify_assertions_failed << + pluralise(totals.assertions.failed, "assertion") << '.'; + } else if (totals.assertions.total() == 0) { + out << + "Passed " << bothOrAll(totals.testCases.total()) + << pluralise(totals.testCases.total(), "test case") + << " (no assertions)."; + } else if (totals.assertions.failed) { + Colour colour(Colour::ResultError); + out << + "Failed " << pluralise(totals.testCases.failed, "test case") << ", " + "failed " << pluralise(totals.assertions.failed, "assertion") << '.'; + } else { + Colour colour(Colour::ResultSuccess); + out << + "Passed " << bothOrAll(totals.testCases.passed) + << pluralise(totals.testCases.passed, "test case") << + " with " << pluralise(totals.assertions.passed, "assertion") << '.'; + } +} + +// Implementation of CompactReporter formatting +class AssertionPrinter { +public: + AssertionPrinter& operator= (AssertionPrinter const&) = delete; + AssertionPrinter(AssertionPrinter const&) = delete; + AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) + : stream(_stream) + , result(_stats.assertionResult) + , messages(_stats.infoMessages) + , itMessage(_stats.infoMessages.begin()) + , printInfoMessages(_printInfoMessages) {} + + void print() { + printSourceInfo(); + + itMessage = messages.begin(); + + switch (result.getResultType()) { + case ResultWas::Ok: + printResultType(Colour::ResultSuccess, passedString()); + printOriginalExpression(); + printReconstructedExpression(); + if (!result.hasExpression()) + printRemainingMessages(Colour::None); + else + printRemainingMessages(); + break; + case ResultWas::ExpressionFailed: + if (result.isOk()) + printResultType(Colour::ResultSuccess, failedString() + std::string(" - but was ok")); + else + printResultType(Colour::Error, failedString()); + printOriginalExpression(); + printReconstructedExpression(); + printRemainingMessages(); + break; + case ResultWas::ThrewException: + printResultType(Colour::Error, failedString()); + printIssue("unexpected exception with message:"); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::FatalErrorCondition: + printResultType(Colour::Error, failedString()); + printIssue("fatal error condition with message:"); + printMessage(); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::DidntThrowException: + printResultType(Colour::Error, failedString()); + printIssue("expected exception, got none"); + printExpressionWas(); + printRemainingMessages(); + break; + case ResultWas::Info: + printResultType(Colour::None, "info"); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::Warning: + printResultType(Colour::None, "warning"); + printMessage(); + printRemainingMessages(); + break; + case ResultWas::ExplicitFailure: + printResultType(Colour::Error, failedString()); + printIssue("explicitly"); + printRemainingMessages(Colour::None); + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + printResultType(Colour::Error, "** internal error **"); + break; + } + } + +private: + void printSourceInfo() const { + Colour colourGuard(Colour::FileName); + stream << result.getSourceInfo() << ':'; + } + + void printResultType(Colour::Code colour, std::string const& passOrFail) const { + if (!passOrFail.empty()) { + { + Colour colourGuard(colour); + stream << ' ' << passOrFail; + } + stream << ':'; + } + } + + void printIssue(std::string const& issue) const { + stream << ' ' << issue; + } + + void printExpressionWas() { + if (result.hasExpression()) { + stream << ';'; + { + Colour colour(dimColour()); + stream << " expression was:"; + } + printOriginalExpression(); + } + } + + void printOriginalExpression() const { + if (result.hasExpression()) { + stream << ' ' << result.getExpression(); + } + } + + void printReconstructedExpression() const { + if (result.hasExpandedExpression()) { + { + Colour colour(dimColour()); + stream << " for: "; + } + stream << result.getExpandedExpression(); + } + } + + void printMessage() { + if (itMessage != messages.end()) { + stream << " '" << itMessage->message << '\''; + ++itMessage; + } + } + + void printRemainingMessages(Colour::Code colour = dimColour()) { + if (itMessage == messages.end()) + return; + + const auto itEnd = messages.cend(); + const auto N = static_cast<std::size_t>(std::distance(itMessage, itEnd)); + + { + Colour colourGuard(colour); + stream << " with " << pluralise(N, "message") << ':'; + } + + while (itMessage != itEnd) { + // If this assertion is a warning ignore any INFO messages + if (printInfoMessages || itMessage->type != ResultWas::Info) { + printMessage(); + if (itMessage != itEnd) { + Colour colourGuard(dimColour()); + stream << " and"; + } + continue; + } + ++itMessage; + } + } + +private: + std::ostream& stream; + AssertionResult const& result; + std::vector<MessageInfo> messages; + std::vector<MessageInfo>::const_iterator itMessage; + bool printInfoMessages; +}; + +} // anon namespace + + std::string CompactReporter::getDescription() { + return "Reports test results on a single line, suitable for IDEs"; + } + + void CompactReporter::noMatchingTestCases( std::string const& spec ) { + stream << "No test cases matched '" << spec << '\'' << std::endl; + } + + void CompactReporter::assertionStarting( AssertionInfo const& ) {} + + bool CompactReporter::assertionEnded( AssertionStats const& _assertionStats ) { + AssertionResult const& result = _assertionStats.assertionResult; + + bool printInfoMessages = true; + + // Drop out if result was successful and we're not printing those + if( !m_config->includeSuccessfulResults() && result.isOk() ) { + if( result.getResultType() != ResultWas::Warning ) + return false; + printInfoMessages = false; + } + + AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); + printer.print(); + + stream << std::endl; + return true; + } + + void CompactReporter::sectionEnded(SectionStats const& _sectionStats) { + double dur = _sectionStats.durationInSeconds; + if ( shouldShowDuration( *m_config, dur ) ) { + stream << getFormattedDuration( dur ) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + } + + void CompactReporter::testRunEnded( TestRunStats const& _testRunStats ) { + printTotals( stream, _testRunStats.totals ); + stream << '\n' << std::endl; + StreamingReporterBase::testRunEnded( _testRunStats ); + } + + CompactReporter::~CompactReporter() {} + + CATCH_REGISTER_REPORTER( "compact", CompactReporter ) + +} // end namespace Catch +// end catch_reporter_compact.cpp +// start catch_reporter_console.cpp + +#include <cfloat> +#include <cstdio> + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch + // Note that 4062 (not all labels are handled and default is missing) is enabled +#endif + +#if defined(__clang__) +# pragma clang diagnostic push +// For simplicity, benchmarking-only helpers are always enabled +# pragma clang diagnostic ignored "-Wunused-function" +#endif + +namespace Catch { + +namespace { + +// Formatter impl for ConsoleReporter +class ConsoleAssertionPrinter { +public: + ConsoleAssertionPrinter& operator= (ConsoleAssertionPrinter const&) = delete; + ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete; + ConsoleAssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) + : stream(_stream), + stats(_stats), + result(_stats.assertionResult), + colour(Colour::None), + message(result.getMessage()), + messages(_stats.infoMessages), + printInfoMessages(_printInfoMessages) { + switch (result.getResultType()) { + case ResultWas::Ok: + colour = Colour::Success; + passOrFail = "PASSED"; + //if( result.hasMessage() ) + if (_stats.infoMessages.size() == 1) + messageLabel = "with message"; + if (_stats.infoMessages.size() > 1) + messageLabel = "with messages"; + break; + case ResultWas::ExpressionFailed: + if (result.isOk()) { + colour = Colour::Success; + passOrFail = "FAILED - but was ok"; + } else { + colour = Colour::Error; + passOrFail = "FAILED"; + } + if (_stats.infoMessages.size() == 1) + messageLabel = "with message"; + if (_stats.infoMessages.size() > 1) + messageLabel = "with messages"; + break; + case ResultWas::ThrewException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to unexpected exception with "; + if (_stats.infoMessages.size() == 1) + messageLabel += "message"; + if (_stats.infoMessages.size() > 1) + messageLabel += "messages"; + break; + case ResultWas::FatalErrorCondition: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "due to a fatal error condition"; + break; + case ResultWas::DidntThrowException: + colour = Colour::Error; + passOrFail = "FAILED"; + messageLabel = "because no exception was thrown where one was expected"; + break; + case ResultWas::Info: + messageLabel = "info"; + break; + case ResultWas::Warning: + messageLabel = "warning"; + break; + case ResultWas::ExplicitFailure: + passOrFail = "FAILED"; + colour = Colour::Error; + if (_stats.infoMessages.size() == 1) + messageLabel = "explicitly with message"; + if (_stats.infoMessages.size() > 1) + messageLabel = "explicitly with messages"; + break; + // These cases are here to prevent compiler warnings + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + passOrFail = "** internal error **"; + colour = Colour::Error; + break; + } + } + + void print() const { + printSourceInfo(); + if (stats.totals.assertions.total() > 0) { + printResultType(); + printOriginalExpression(); + printReconstructedExpression(); + } else { + stream << '\n'; + } + printMessage(); + } + +private: + void printResultType() const { + if (!passOrFail.empty()) { + Colour colourGuard(colour); + stream << passOrFail << ":\n"; + } + } + void printOriginalExpression() const { + if (result.hasExpression()) { + Colour colourGuard(Colour::OriginalExpression); + stream << " "; + stream << result.getExpressionInMacro(); + stream << '\n'; + } + } + void printReconstructedExpression() const { + if (result.hasExpandedExpression()) { + stream << "with expansion:\n"; + Colour colourGuard(Colour::ReconstructedExpression); + stream << Column(result.getExpandedExpression()).indent(2) << '\n'; + } + } + void printMessage() const { + if (!messageLabel.empty()) + stream << messageLabel << ':' << '\n'; + for (auto const& msg : messages) { + // If this assertion is a warning ignore any INFO messages + if (printInfoMessages || msg.type != ResultWas::Info) + stream << Column(msg.message).indent(2) << '\n'; + } + } + void printSourceInfo() const { + Colour colourGuard(Colour::FileName); + stream << result.getSourceInfo() << ": "; + } + + std::ostream& stream; + AssertionStats const& stats; + AssertionResult const& result; + Colour::Code colour; + std::string passOrFail; + std::string messageLabel; + std::string message; + std::vector<MessageInfo> messages; + bool printInfoMessages; +}; + +std::size_t makeRatio(std::size_t number, std::size_t total) { + std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0; + return (ratio == 0 && number > 0) ? 1 : ratio; +} + +std::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) { + if (i > j && i > k) + return i; + else if (j > k) + return j; + else + return k; +} + +struct ColumnInfo { + enum Justification { Left, Right }; + std::string name; + int width; + Justification justification; +}; +struct ColumnBreak {}; +struct RowBreak {}; + +class Duration { + enum class Unit { + Auto, + Nanoseconds, + Microseconds, + Milliseconds, + Seconds, + Minutes + }; + static const uint64_t s_nanosecondsInAMicrosecond = 1000; + static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond; + static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond; + static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond; + + double m_inNanoseconds; + Unit m_units; + +public: + explicit Duration(double inNanoseconds, Unit units = Unit::Auto) + : m_inNanoseconds(inNanoseconds), + m_units(units) { + if (m_units == Unit::Auto) { + if (m_inNanoseconds < s_nanosecondsInAMicrosecond) + m_units = Unit::Nanoseconds; + else if (m_inNanoseconds < s_nanosecondsInAMillisecond) + m_units = Unit::Microseconds; + else if (m_inNanoseconds < s_nanosecondsInASecond) + m_units = Unit::Milliseconds; + else if (m_inNanoseconds < s_nanosecondsInAMinute) + m_units = Unit::Seconds; + else + m_units = Unit::Minutes; + } + + } + + auto value() const -> double { + switch (m_units) { + case Unit::Microseconds: + return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMicrosecond); + case Unit::Milliseconds: + return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMillisecond); + case Unit::Seconds: + return m_inNanoseconds / static_cast<double>(s_nanosecondsInASecond); + case Unit::Minutes: + return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute); + default: + return m_inNanoseconds; + } + } + auto unitsAsString() const -> std::string { + switch (m_units) { + case Unit::Nanoseconds: + return "ns"; + case Unit::Microseconds: + return "us"; + case Unit::Milliseconds: + return "ms"; + case Unit::Seconds: + return "s"; + case Unit::Minutes: + return "m"; + default: + return "** internal error **"; + } + + } + friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& { + return os << duration.value() << ' ' << duration.unitsAsString(); + } +}; +} // end anon namespace + +class TablePrinter { + std::ostream& m_os; + std::vector<ColumnInfo> m_columnInfos; + std::ostringstream m_oss; + int m_currentColumn = -1; + bool m_isOpen = false; + +public: + TablePrinter( std::ostream& os, std::vector<ColumnInfo> columnInfos ) + : m_os( os ), + m_columnInfos( std::move( columnInfos ) ) {} + + auto columnInfos() const -> std::vector<ColumnInfo> const& { + return m_columnInfos; + } + + void open() { + if (!m_isOpen) { + m_isOpen = true; + *this << RowBreak(); + + Columns headerCols; + Spacer spacer(2); + for (auto const& info : m_columnInfos) { + headerCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2)); + headerCols += spacer; + } + m_os << headerCols << '\n'; + + m_os << Catch::getLineOfChars<'-'>() << '\n'; + } + } + void close() { + if (m_isOpen) { + *this << RowBreak(); + m_os << std::endl; + m_isOpen = false; + } + } + + template<typename T> + friend TablePrinter& operator << (TablePrinter& tp, T const& value) { + tp.m_oss << value; + return tp; + } + + friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) { + auto colStr = tp.m_oss.str(); + const auto strSize = colStr.size(); + tp.m_oss.str(""); + tp.open(); + if (tp.m_currentColumn == static_cast<int>(tp.m_columnInfos.size() - 1)) { + tp.m_currentColumn = -1; + tp.m_os << '\n'; + } + tp.m_currentColumn++; + + auto colInfo = tp.m_columnInfos[tp.m_currentColumn]; + auto padding = (strSize + 1 < static_cast<std::size_t>(colInfo.width)) + ? std::string(colInfo.width - (strSize + 1), ' ') + : std::string(); + if (colInfo.justification == ColumnInfo::Left) + tp.m_os << colStr << padding << ' '; + else + tp.m_os << padding << colStr << ' '; + return tp; + } + + friend TablePrinter& operator << (TablePrinter& tp, RowBreak) { + if (tp.m_currentColumn > 0) { + tp.m_os << '\n'; + tp.m_currentColumn = -1; + } + return tp; + } +}; + +ConsoleReporter::ConsoleReporter(ReporterConfig const& config) + : StreamingReporterBase(config), + m_tablePrinter(new TablePrinter(config.stream(), + [&config]() -> std::vector<ColumnInfo> { + if (config.fullConfig()->benchmarkNoAnalysis()) + { + return{ + { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, + { " samples", 14, ColumnInfo::Right }, + { " iterations", 14, ColumnInfo::Right }, + { " mean", 14, ColumnInfo::Right } + }; + } + else + { + return{ + { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left }, + { "samples mean std dev", 14, ColumnInfo::Right }, + { "iterations low mean low std dev", 14, ColumnInfo::Right }, + { "estimated high mean high std dev", 14, ColumnInfo::Right } + }; + } + }())) {} +ConsoleReporter::~ConsoleReporter() = default; + +std::string ConsoleReporter::getDescription() { + return "Reports test results as plain lines of text"; +} + +void ConsoleReporter::noMatchingTestCases(std::string const& spec) { + stream << "No test cases matched '" << spec << '\'' << std::endl; +} + +void ConsoleReporter::reportInvalidArguments(std::string const&arg){ + stream << "Invalid Filter: " << arg << std::endl; +} + +void ConsoleReporter::assertionStarting(AssertionInfo const&) {} + +bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) { + AssertionResult const& result = _assertionStats.assertionResult; + + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + // Drop out if result was successful but we're not printing them. + if (!includeResults && result.getResultType() != ResultWas::Warning) + return false; + + lazyPrint(); + + ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults); + printer.print(); + stream << std::endl; + return true; +} + +void ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) { + m_tablePrinter->close(); + m_headerPrinted = false; + StreamingReporterBase::sectionStarting(_sectionInfo); +} +void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) { + m_tablePrinter->close(); + if (_sectionStats.missingAssertions) { + lazyPrint(); + Colour colour(Colour::ResultError); + if (m_sectionStack.size() > 1) + stream << "\nNo assertions in section"; + else + stream << "\nNo assertions in test case"; + stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; + } + double dur = _sectionStats.durationInSeconds; + if (shouldShowDuration(*m_config, dur)) { + stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name << std::endl; + } + if (m_headerPrinted) { + m_headerPrinted = false; + } + StreamingReporterBase::sectionEnded(_sectionStats); +} + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +void ConsoleReporter::benchmarkPreparing(std::string const& name) { + lazyPrintWithoutClosingBenchmarkTable(); + + auto nameCol = Column(name).width(static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2)); + + bool firstLine = true; + for (auto line : nameCol) { + if (!firstLine) + (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak(); + else + firstLine = false; + + (*m_tablePrinter) << line << ColumnBreak(); + } +} + +void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) { + (*m_tablePrinter) << info.samples << ColumnBreak() + << info.iterations << ColumnBreak(); + if (!m_config->benchmarkNoAnalysis()) + (*m_tablePrinter) << Duration(info.estimatedDuration) << ColumnBreak(); +} +void ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) { + if (m_config->benchmarkNoAnalysis()) + { + (*m_tablePrinter) << Duration(stats.mean.point.count()) << ColumnBreak(); + } + else + { + (*m_tablePrinter) << ColumnBreak() + << Duration(stats.mean.point.count()) << ColumnBreak() + << Duration(stats.mean.lower_bound.count()) << ColumnBreak() + << Duration(stats.mean.upper_bound.count()) << ColumnBreak() << ColumnBreak() + << Duration(stats.standardDeviation.point.count()) << ColumnBreak() + << Duration(stats.standardDeviation.lower_bound.count()) << ColumnBreak() + << Duration(stats.standardDeviation.upper_bound.count()) << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak(); + } +} + +void ConsoleReporter::benchmarkFailed(std::string const& error) { + Colour colour(Colour::Red); + (*m_tablePrinter) + << "Benchmark failed (" << error << ')' + << ColumnBreak() << RowBreak(); +} +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + +void ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) { + m_tablePrinter->close(); + StreamingReporterBase::testCaseEnded(_testCaseStats); + m_headerPrinted = false; +} +void ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) { + if (currentGroupInfo.used) { + printSummaryDivider(); + stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; + printTotals(_testGroupStats.totals); + stream << '\n' << std::endl; + } + StreamingReporterBase::testGroupEnded(_testGroupStats); +} +void ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) { + printTotalsDivider(_testRunStats.totals); + printTotals(_testRunStats.totals); + stream << std::endl; + StreamingReporterBase::testRunEnded(_testRunStats); +} +void ConsoleReporter::testRunStarting(TestRunInfo const& _testInfo) { + StreamingReporterBase::testRunStarting(_testInfo); + printTestFilters(); +} + +void ConsoleReporter::lazyPrint() { + + m_tablePrinter->close(); + lazyPrintWithoutClosingBenchmarkTable(); +} + +void ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() { + + if (!currentTestRunInfo.used) + lazyPrintRunInfo(); + if (!currentGroupInfo.used) + lazyPrintGroupInfo(); + + if (!m_headerPrinted) { + printTestCaseAndSectionHeader(); + m_headerPrinted = true; + } +} +void ConsoleReporter::lazyPrintRunInfo() { + stream << '\n' << getLineOfChars<'~'>() << '\n'; + Colour colour(Colour::SecondaryText); + stream << currentTestRunInfo->name + << " is a Catch v" << libraryVersion() << " host application.\n" + << "Run with -? for options\n\n"; + + if (m_config->rngSeed() != 0) + stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; + + currentTestRunInfo.used = true; +} +void ConsoleReporter::lazyPrintGroupInfo() { + if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) { + printClosedHeader("Group: " + currentGroupInfo->name); + currentGroupInfo.used = true; + } +} +void ConsoleReporter::printTestCaseAndSectionHeader() { + assert(!m_sectionStack.empty()); + printOpenHeader(currentTestCaseInfo->name); + + if (m_sectionStack.size() > 1) { + Colour colourGuard(Colour::Headers); + + auto + it = m_sectionStack.begin() + 1, // Skip first section (test case) + itEnd = m_sectionStack.end(); + for (; it != itEnd; ++it) + printHeaderString(it->name, 2); + } + + SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; + + stream << getLineOfChars<'-'>() << '\n'; + Colour colourGuard(Colour::FileName); + stream << lineInfo << '\n'; + stream << getLineOfChars<'.'>() << '\n' << std::endl; +} + +void ConsoleReporter::printClosedHeader(std::string const& _name) { + printOpenHeader(_name); + stream << getLineOfChars<'.'>() << '\n'; +} +void ConsoleReporter::printOpenHeader(std::string const& _name) { + stream << getLineOfChars<'-'>() << '\n'; + { + Colour colourGuard(Colour::Headers); + printHeaderString(_name); + } +} + +// if string has a : in first line will set indent to follow it on +// subsequent lines +void ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) { + std::size_t i = _string.find(": "); + if (i != std::string::npos) + i += 2; + else + i = 0; + stream << Column(_string).indent(indent + i).initialIndent(indent) << '\n'; +} + +struct SummaryColumn { + + SummaryColumn( std::string _label, Colour::Code _colour ) + : label( std::move( _label ) ), + colour( _colour ) {} + SummaryColumn addRow( std::size_t count ) { + ReusableStringStream rss; + rss << count; + std::string row = rss.str(); + for (auto& oldRow : rows) { + while (oldRow.size() < row.size()) + oldRow = ' ' + oldRow; + while (oldRow.size() > row.size()) + row = ' ' + row; + } + rows.push_back(row); + return *this; + } + + std::string label; + Colour::Code colour; + std::vector<std::string> rows; + +}; + +void ConsoleReporter::printTotals( Totals const& totals ) { + if (totals.testCases.total() == 0) { + stream << Colour(Colour::Warning) << "No tests ran\n"; + } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) { + stream << Colour(Colour::ResultSuccess) << "All tests passed"; + stream << " (" + << pluralise(totals.assertions.passed, "assertion") << " in " + << pluralise(totals.testCases.passed, "test case") << ')' + << '\n'; + } else { + + std::vector<SummaryColumn> columns; + columns.push_back(SummaryColumn("", Colour::None) + .addRow(totals.testCases.total()) + .addRow(totals.assertions.total())); + columns.push_back(SummaryColumn("passed", Colour::Success) + .addRow(totals.testCases.passed) + .addRow(totals.assertions.passed)); + columns.push_back(SummaryColumn("failed", Colour::ResultError) + .addRow(totals.testCases.failed) + .addRow(totals.assertions.failed)); + columns.push_back(SummaryColumn("failed as expected", Colour::ResultExpectedFailure) + .addRow(totals.testCases.failedButOk) + .addRow(totals.assertions.failedButOk)); + + printSummaryRow("test cases", columns, 0); + printSummaryRow("assertions", columns, 1); + } +} +void ConsoleReporter::printSummaryRow(std::string const& label, std::vector<SummaryColumn> const& cols, std::size_t row) { + for (auto col : cols) { + std::string value = col.rows[row]; + if (col.label.empty()) { + stream << label << ": "; + if (value != "0") + stream << value; + else + stream << Colour(Colour::Warning) << "- none -"; + } else if (value != "0") { + stream << Colour(Colour::LightGrey) << " | "; + stream << Colour(col.colour) + << value << ' ' << col.label; + } + } + stream << '\n'; +} + +void ConsoleReporter::printTotalsDivider(Totals const& totals) { + if (totals.testCases.total() > 0) { + std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total()); + std::size_t failedButOkRatio = makeRatio(totals.testCases.failedButOk, totals.testCases.total()); + std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total()); + while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1) + findMax(failedRatio, failedButOkRatio, passedRatio)++; + while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1) + findMax(failedRatio, failedButOkRatio, passedRatio)--; + + stream << Colour(Colour::Error) << std::string(failedRatio, '='); + stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '='); + if (totals.testCases.allPassed()) + stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '='); + else + stream << Colour(Colour::Success) << std::string(passedRatio, '='); + } else { + stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '='); + } + stream << '\n'; +} +void ConsoleReporter::printSummaryDivider() { + stream << getLineOfChars<'-'>() << '\n'; +} + +void ConsoleReporter::printTestFilters() { + if (m_config->testSpec().hasFilters()) { + Colour guard(Colour::BrightYellow); + stream << "Filters: " << serializeFilters(m_config->getTestsOrTags()) << '\n'; + } +} + +CATCH_REGISTER_REPORTER("console", ConsoleReporter) + +} // end namespace Catch + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif +// end catch_reporter_console.cpp +// start catch_reporter_junit.cpp + +#include <cassert> +#include <sstream> +#include <ctime> +#include <algorithm> + +namespace Catch { + + namespace { + std::string getCurrentTimestamp() { + // Beware, this is not reentrant because of backward compatibility issues + // Also, UTC only, again because of backward compatibility (%z is C++11) + time_t rawtime; + std::time(&rawtime); + auto const timeStampSize = sizeof("2017-01-16T17:06:45Z"); + +#ifdef _MSC_VER + std::tm timeInfo = {}; + gmtime_s(&timeInfo, &rawtime); +#else + std::tm* timeInfo; + timeInfo = std::gmtime(&rawtime); +#endif + + char timeStamp[timeStampSize]; + const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; + +#ifdef _MSC_VER + std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); +#else + std::strftime(timeStamp, timeStampSize, fmt, timeInfo); +#endif + return std::string(timeStamp); + } + + std::string fileNameTag(const std::vector<std::string> &tags) { + auto it = std::find_if(begin(tags), + end(tags), + [] (std::string const& tag) {return tag.front() == '#'; }); + if (it != tags.end()) + return it->substr(1); + return std::string(); + } + } // anonymous namespace + + JunitReporter::JunitReporter( ReporterConfig const& _config ) + : CumulativeReporterBase( _config ), + xml( _config.stream() ) + { + m_reporterPrefs.shouldRedirectStdOut = true; + m_reporterPrefs.shouldReportAllAssertions = true; + } + + JunitReporter::~JunitReporter() {} + + std::string JunitReporter::getDescription() { + return "Reports test results in an XML format that looks like Ant's junitreport target"; + } + + void JunitReporter::noMatchingTestCases( std::string const& /*spec*/ ) {} + + void JunitReporter::testRunStarting( TestRunInfo const& runInfo ) { + CumulativeReporterBase::testRunStarting( runInfo ); + xml.startElement( "testsuites" ); + } + + void JunitReporter::testGroupStarting( GroupInfo const& groupInfo ) { + suiteTimer.start(); + stdOutForSuite.clear(); + stdErrForSuite.clear(); + unexpectedExceptions = 0; + CumulativeReporterBase::testGroupStarting( groupInfo ); + } + + void JunitReporter::testCaseStarting( TestCaseInfo const& testCaseInfo ) { + m_okToFail = testCaseInfo.okToFail(); + } + + bool JunitReporter::assertionEnded( AssertionStats const& assertionStats ) { + if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail ) + unexpectedExceptions++; + return CumulativeReporterBase::assertionEnded( assertionStats ); + } + + void JunitReporter::testCaseEnded( TestCaseStats const& testCaseStats ) { + stdOutForSuite += testCaseStats.stdOut; + stdErrForSuite += testCaseStats.stdErr; + CumulativeReporterBase::testCaseEnded( testCaseStats ); + } + + void JunitReporter::testGroupEnded( TestGroupStats const& testGroupStats ) { + double suiteTime = suiteTimer.getElapsedSeconds(); + CumulativeReporterBase::testGroupEnded( testGroupStats ); + writeGroup( *m_testGroups.back(), suiteTime ); + } + + void JunitReporter::testRunEndedCumulative() { + xml.endElement(); + } + + void JunitReporter::writeGroup( TestGroupNode const& groupNode, double suiteTime ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); + + TestGroupStats const& stats = groupNode.value; + xml.writeAttribute( "name", stats.groupInfo.name ); + xml.writeAttribute( "errors", unexpectedExceptions ); + xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); + xml.writeAttribute( "tests", stats.totals.assertions.total() ); + xml.writeAttribute( "hostname", "tbd" ); // !TBD + if( m_config->showDurations() == ShowDurations::Never ) + xml.writeAttribute( "time", "" ); + else + xml.writeAttribute( "time", suiteTime ); + xml.writeAttribute( "timestamp", getCurrentTimestamp() ); + + // Write properties if there are any + if (m_config->hasTestFilters() || m_config->rngSeed() != 0) { + auto properties = xml.scopedElement("properties"); + if (m_config->hasTestFilters()) { + xml.scopedElement("property") + .writeAttribute("name", "filters") + .writeAttribute("value", serializeFilters(m_config->getTestsOrTags())); + } + if (m_config->rngSeed() != 0) { + xml.scopedElement("property") + .writeAttribute("name", "random-seed") + .writeAttribute("value", m_config->rngSeed()); + } + } + + // Write test cases + for( auto const& child : groupNode.children ) + writeTestCase( *child ); + + xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite ), XmlFormatting::Newline ); + xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite ), XmlFormatting::Newline ); + } + + void JunitReporter::writeTestCase( TestCaseNode const& testCaseNode ) { + TestCaseStats const& stats = testCaseNode.value; + + // All test cases have exactly one section - which represents the + // test case itself. That section may have 0-n nested sections + assert( testCaseNode.children.size() == 1 ); + SectionNode const& rootSection = *testCaseNode.children.front(); + + std::string className = stats.testInfo.className; + + if( className.empty() ) { + className = fileNameTag(stats.testInfo.tags); + if ( className.empty() ) + className = "global"; + } + + if ( !m_config->name().empty() ) + className = m_config->name() + "." + className; + + writeSection( className, "", rootSection ); + } + + void JunitReporter::writeSection( std::string const& className, + std::string const& rootName, + SectionNode const& sectionNode ) { + std::string name = trim( sectionNode.stats.sectionInfo.name ); + if( !rootName.empty() ) + name = rootName + '/' + name; + + if( !sectionNode.assertions.empty() || + !sectionNode.stdOut.empty() || + !sectionNode.stdErr.empty() ) { + XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); + if( className.empty() ) { + xml.writeAttribute( "classname", name ); + xml.writeAttribute( "name", "root" ); + } + else { + xml.writeAttribute( "classname", className ); + xml.writeAttribute( "name", name ); + } + xml.writeAttribute( "time", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) ); + // This is not ideal, but it should be enough to mimic gtest's + // junit output. + // Ideally the JUnit reporter would also handle `skipTest` + // events and write those out appropriately. + xml.writeAttribute( "status", "run" ); + + writeAssertions( sectionNode ); + + if( !sectionNode.stdOut.empty() ) + xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), XmlFormatting::Newline ); + if( !sectionNode.stdErr.empty() ) + xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), XmlFormatting::Newline ); + } + for( auto const& childNode : sectionNode.childSections ) + if( className.empty() ) + writeSection( name, "", *childNode ); + else + writeSection( className, name, *childNode ); + } + + void JunitReporter::writeAssertions( SectionNode const& sectionNode ) { + for( auto const& assertion : sectionNode.assertions ) + writeAssertion( assertion ); + } + + void JunitReporter::writeAssertion( AssertionStats const& stats ) { + AssertionResult const& result = stats.assertionResult; + if( !result.isOk() ) { + std::string elementName; + switch( result.getResultType() ) { + case ResultWas::ThrewException: + case ResultWas::FatalErrorCondition: + elementName = "error"; + break; + case ResultWas::ExplicitFailure: + case ResultWas::ExpressionFailed: + case ResultWas::DidntThrowException: + elementName = "failure"; + break; + + // We should never see these here: + case ResultWas::Info: + case ResultWas::Warning: + case ResultWas::Ok: + case ResultWas::Unknown: + case ResultWas::FailureBit: + case ResultWas::Exception: + elementName = "internalError"; + break; + } + + XmlWriter::ScopedElement e = xml.scopedElement( elementName ); + + xml.writeAttribute( "message", result.getExpression() ); + xml.writeAttribute( "type", result.getTestMacroName() ); + + ReusableStringStream rss; + if (stats.totals.assertions.total() > 0) { + rss << "FAILED" << ":\n"; + if (result.hasExpression()) { + rss << " "; + rss << result.getExpressionInMacro(); + rss << '\n'; + } + if (result.hasExpandedExpression()) { + rss << "with expansion:\n"; + rss << Column(result.getExpandedExpression()).indent(2) << '\n'; + } + } else { + rss << '\n'; + } + + if( !result.getMessage().empty() ) + rss << result.getMessage() << '\n'; + for( auto const& msg : stats.infoMessages ) + if( msg.type == ResultWas::Info ) + rss << msg.message << '\n'; + + rss << "at " << result.getSourceInfo(); + xml.writeText( rss.str(), XmlFormatting::Newline ); + } + } + + CATCH_REGISTER_REPORTER( "junit", JunitReporter ) + +} // end namespace Catch +// end catch_reporter_junit.cpp +// start catch_reporter_listening.cpp + +#include <cassert> + +namespace Catch { + + ListeningReporter::ListeningReporter() { + // We will assume that listeners will always want all assertions + m_preferences.shouldReportAllAssertions = true; + } + + void ListeningReporter::addListener( IStreamingReporterPtr&& listener ) { + m_listeners.push_back( std::move( listener ) ); + } + + void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) { + assert(!m_reporter && "Listening reporter can wrap only 1 real reporter"); + m_reporter = std::move( reporter ); + m_preferences.shouldRedirectStdOut = m_reporter->getPreferences().shouldRedirectStdOut; + } + + ReporterPreferences ListeningReporter::getPreferences() const { + return m_preferences; + } + + std::set<Verbosity> ListeningReporter::getSupportedVerbosities() { + return std::set<Verbosity>{ }; + } + + void ListeningReporter::noMatchingTestCases( std::string const& spec ) { + for ( auto const& listener : m_listeners ) { + listener->noMatchingTestCases( spec ); + } + m_reporter->noMatchingTestCases( spec ); + } + + void ListeningReporter::reportInvalidArguments(std::string const&arg){ + for ( auto const& listener : m_listeners ) { + listener->reportInvalidArguments( arg ); + } + m_reporter->reportInvalidArguments( arg ); + } + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void ListeningReporter::benchmarkPreparing( std::string const& name ) { + for (auto const& listener : m_listeners) { + listener->benchmarkPreparing(name); + } + m_reporter->benchmarkPreparing(name); + } + void ListeningReporter::benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) { + for ( auto const& listener : m_listeners ) { + listener->benchmarkStarting( benchmarkInfo ); + } + m_reporter->benchmarkStarting( benchmarkInfo ); + } + void ListeningReporter::benchmarkEnded( BenchmarkStats<> const& benchmarkStats ) { + for ( auto const& listener : m_listeners ) { + listener->benchmarkEnded( benchmarkStats ); + } + m_reporter->benchmarkEnded( benchmarkStats ); + } + + void ListeningReporter::benchmarkFailed( std::string const& error ) { + for (auto const& listener : m_listeners) { + listener->benchmarkFailed(error); + } + m_reporter->benchmarkFailed(error); + } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + void ListeningReporter::testRunStarting( TestRunInfo const& testRunInfo ) { + for ( auto const& listener : m_listeners ) { + listener->testRunStarting( testRunInfo ); + } + m_reporter->testRunStarting( testRunInfo ); + } + + void ListeningReporter::testGroupStarting( GroupInfo const& groupInfo ) { + for ( auto const& listener : m_listeners ) { + listener->testGroupStarting( groupInfo ); + } + m_reporter->testGroupStarting( groupInfo ); + } + + void ListeningReporter::testCaseStarting( TestCaseInfo const& testInfo ) { + for ( auto const& listener : m_listeners ) { + listener->testCaseStarting( testInfo ); + } + m_reporter->testCaseStarting( testInfo ); + } + + void ListeningReporter::sectionStarting( SectionInfo const& sectionInfo ) { + for ( auto const& listener : m_listeners ) { + listener->sectionStarting( sectionInfo ); + } + m_reporter->sectionStarting( sectionInfo ); + } + + void ListeningReporter::assertionStarting( AssertionInfo const& assertionInfo ) { + for ( auto const& listener : m_listeners ) { + listener->assertionStarting( assertionInfo ); + } + m_reporter->assertionStarting( assertionInfo ); + } + + // The return value indicates if the messages buffer should be cleared: + bool ListeningReporter::assertionEnded( AssertionStats const& assertionStats ) { + for( auto const& listener : m_listeners ) { + static_cast<void>( listener->assertionEnded( assertionStats ) ); + } + return m_reporter->assertionEnded( assertionStats ); + } + + void ListeningReporter::sectionEnded( SectionStats const& sectionStats ) { + for ( auto const& listener : m_listeners ) { + listener->sectionEnded( sectionStats ); + } + m_reporter->sectionEnded( sectionStats ); + } + + void ListeningReporter::testCaseEnded( TestCaseStats const& testCaseStats ) { + for ( auto const& listener : m_listeners ) { + listener->testCaseEnded( testCaseStats ); + } + m_reporter->testCaseEnded( testCaseStats ); + } + + void ListeningReporter::testGroupEnded( TestGroupStats const& testGroupStats ) { + for ( auto const& listener : m_listeners ) { + listener->testGroupEnded( testGroupStats ); + } + m_reporter->testGroupEnded( testGroupStats ); + } + + void ListeningReporter::testRunEnded( TestRunStats const& testRunStats ) { + for ( auto const& listener : m_listeners ) { + listener->testRunEnded( testRunStats ); + } + m_reporter->testRunEnded( testRunStats ); + } + + void ListeningReporter::skipTest( TestCaseInfo const& testInfo ) { + for ( auto const& listener : m_listeners ) { + listener->skipTest( testInfo ); + } + m_reporter->skipTest( testInfo ); + } + + bool ListeningReporter::isMulti() const { + return true; + } + +} // end namespace Catch +// end catch_reporter_listening.cpp +// start catch_reporter_xml.cpp + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch + // Note that 4062 (not all labels are handled + // and default is missing) is enabled +#endif + +namespace Catch { + XmlReporter::XmlReporter( ReporterConfig const& _config ) + : StreamingReporterBase( _config ), + m_xml(_config.stream()) + { + m_reporterPrefs.shouldRedirectStdOut = true; + m_reporterPrefs.shouldReportAllAssertions = true; + } + + XmlReporter::~XmlReporter() = default; + + std::string XmlReporter::getDescription() { + return "Reports test results as an XML document"; + } + + std::string XmlReporter::getStylesheetRef() const { + return std::string(); + } + + void XmlReporter::writeSourceInfo( SourceLineInfo const& sourceInfo ) { + m_xml + .writeAttribute( "filename", sourceInfo.file ) + .writeAttribute( "line", sourceInfo.line ); + } + + void XmlReporter::noMatchingTestCases( std::string const& s ) { + StreamingReporterBase::noMatchingTestCases( s ); + } + + void XmlReporter::testRunStarting( TestRunInfo const& testInfo ) { + StreamingReporterBase::testRunStarting( testInfo ); + std::string stylesheetRef = getStylesheetRef(); + if( !stylesheetRef.empty() ) + m_xml.writeStylesheetRef( stylesheetRef ); + m_xml.startElement( "Catch" ); + if( !m_config->name().empty() ) + m_xml.writeAttribute( "name", m_config->name() ); + if (m_config->testSpec().hasFilters()) + m_xml.writeAttribute( "filters", serializeFilters( m_config->getTestsOrTags() ) ); + if( m_config->rngSeed() != 0 ) + m_xml.scopedElement( "Randomness" ) + .writeAttribute( "seed", m_config->rngSeed() ); + } + + void XmlReporter::testGroupStarting( GroupInfo const& groupInfo ) { + StreamingReporterBase::testGroupStarting( groupInfo ); + m_xml.startElement( "Group" ) + .writeAttribute( "name", groupInfo.name ); + } + + void XmlReporter::testCaseStarting( TestCaseInfo const& testInfo ) { + StreamingReporterBase::testCaseStarting(testInfo); + m_xml.startElement( "TestCase" ) + .writeAttribute( "name", trim( testInfo.name ) ) + .writeAttribute( "description", testInfo.description ) + .writeAttribute( "tags", testInfo.tagsAsString() ); + + writeSourceInfo( testInfo.lineInfo ); + + if ( m_config->showDurations() == ShowDurations::Always ) + m_testCaseTimer.start(); + m_xml.ensureTagClosed(); + } + + void XmlReporter::sectionStarting( SectionInfo const& sectionInfo ) { + StreamingReporterBase::sectionStarting( sectionInfo ); + if( m_sectionDepth++ > 0 ) { + m_xml.startElement( "Section" ) + .writeAttribute( "name", trim( sectionInfo.name ) ); + writeSourceInfo( sectionInfo.lineInfo ); + m_xml.ensureTagClosed(); + } + } + + void XmlReporter::assertionStarting( AssertionInfo const& ) { } + + bool XmlReporter::assertionEnded( AssertionStats const& assertionStats ) { + + AssertionResult const& result = assertionStats.assertionResult; + + bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); + + if( includeResults || result.getResultType() == ResultWas::Warning ) { + // Print any info messages in <Info> tags. + for( auto const& msg : assertionStats.infoMessages ) { + if( msg.type == ResultWas::Info && includeResults ) { + m_xml.scopedElement( "Info" ) + .writeText( msg.message ); + } else if ( msg.type == ResultWas::Warning ) { + m_xml.scopedElement( "Warning" ) + .writeText( msg.message ); + } + } + } + + // Drop out if result was successful but we're not printing them. + if( !includeResults && result.getResultType() != ResultWas::Warning ) + return true; + + // Print the expression if there is one. + if( result.hasExpression() ) { + m_xml.startElement( "Expression" ) + .writeAttribute( "success", result.succeeded() ) + .writeAttribute( "type", result.getTestMacroName() ); + + writeSourceInfo( result.getSourceInfo() ); + + m_xml.scopedElement( "Original" ) + .writeText( result.getExpression() ); + m_xml.scopedElement( "Expanded" ) + .writeText( result.getExpandedExpression() ); + } + + // And... Print a result applicable to each result type. + switch( result.getResultType() ) { + case ResultWas::ThrewException: + m_xml.startElement( "Exception" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + case ResultWas::FatalErrorCondition: + m_xml.startElement( "FatalErrorCondition" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + case ResultWas::Info: + m_xml.scopedElement( "Info" ) + .writeText( result.getMessage() ); + break; + case ResultWas::Warning: + // Warning will already have been written + break; + case ResultWas::ExplicitFailure: + m_xml.startElement( "Failure" ); + writeSourceInfo( result.getSourceInfo() ); + m_xml.writeText( result.getMessage() ); + m_xml.endElement(); + break; + default: + break; + } + + if( result.hasExpression() ) + m_xml.endElement(); + + return true; + } + + void XmlReporter::sectionEnded( SectionStats const& sectionStats ) { + StreamingReporterBase::sectionEnded( sectionStats ); + if( --m_sectionDepth > 0 ) { + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); + e.writeAttribute( "successes", sectionStats.assertions.passed ); + e.writeAttribute( "failures", sectionStats.assertions.failed ); + e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); + + m_xml.endElement(); + } + } + + void XmlReporter::testCaseEnded( TestCaseStats const& testCaseStats ) { + StreamingReporterBase::testCaseEnded( testCaseStats ); + XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); + e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); + + if ( m_config->showDurations() == ShowDurations::Always ) + e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); + + if( !testCaseStats.stdOut.empty() ) + m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), XmlFormatting::Newline ); + if( !testCaseStats.stdErr.empty() ) + m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), XmlFormatting::Newline ); + + m_xml.endElement(); + } + + void XmlReporter::testGroupEnded( TestGroupStats const& testGroupStats ) { + StreamingReporterBase::testGroupEnded( testGroupStats ); + // TODO: Check testGroupStats.aborting and act accordingly. + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) + .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); + m_xml.scopedElement( "OverallResultsCases") + .writeAttribute( "successes", testGroupStats.totals.testCases.passed ) + .writeAttribute( "failures", testGroupStats.totals.testCases.failed ) + .writeAttribute( "expectedFailures", testGroupStats.totals.testCases.failedButOk ); + m_xml.endElement(); + } + + void XmlReporter::testRunEnded( TestRunStats const& testRunStats ) { + StreamingReporterBase::testRunEnded( testRunStats ); + m_xml.scopedElement( "OverallResults" ) + .writeAttribute( "successes", testRunStats.totals.assertions.passed ) + .writeAttribute( "failures", testRunStats.totals.assertions.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); + m_xml.scopedElement( "OverallResultsCases") + .writeAttribute( "successes", testRunStats.totals.testCases.passed ) + .writeAttribute( "failures", testRunStats.totals.testCases.failed ) + .writeAttribute( "expectedFailures", testRunStats.totals.testCases.failedButOk ); + m_xml.endElement(); + } + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) + void XmlReporter::benchmarkPreparing(std::string const& name) { + m_xml.startElement("BenchmarkResults") + .writeAttribute("name", name); + } + + void XmlReporter::benchmarkStarting(BenchmarkInfo const &info) { + m_xml.writeAttribute("samples", info.samples) + .writeAttribute("resamples", info.resamples) + .writeAttribute("iterations", info.iterations) + .writeAttribute("clockResolution", info.clockResolution) + .writeAttribute("estimatedDuration", info.estimatedDuration) + .writeComment("All values in nano seconds"); + } + + void XmlReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) { + m_xml.startElement("mean") + .writeAttribute("value", benchmarkStats.mean.point.count()) + .writeAttribute("lowerBound", benchmarkStats.mean.lower_bound.count()) + .writeAttribute("upperBound", benchmarkStats.mean.upper_bound.count()) + .writeAttribute("ci", benchmarkStats.mean.confidence_interval); + m_xml.endElement(); + m_xml.startElement("standardDeviation") + .writeAttribute("value", benchmarkStats.standardDeviation.point.count()) + .writeAttribute("lowerBound", benchmarkStats.standardDeviation.lower_bound.count()) + .writeAttribute("upperBound", benchmarkStats.standardDeviation.upper_bound.count()) + .writeAttribute("ci", benchmarkStats.standardDeviation.confidence_interval); + m_xml.endElement(); + m_xml.startElement("outliers") + .writeAttribute("variance", benchmarkStats.outlierVariance) + .writeAttribute("lowMild", benchmarkStats.outliers.low_mild) + .writeAttribute("lowSevere", benchmarkStats.outliers.low_severe) + .writeAttribute("highMild", benchmarkStats.outliers.high_mild) + .writeAttribute("highSevere", benchmarkStats.outliers.high_severe); + m_xml.endElement(); + m_xml.endElement(); + } + + void XmlReporter::benchmarkFailed(std::string const &error) { + m_xml.scopedElement("failed"). + writeAttribute("message", error); + m_xml.endElement(); + } +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + + CATCH_REGISTER_REPORTER( "xml", XmlReporter ) + +} // end namespace Catch + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif +// end catch_reporter_xml.cpp + +namespace Catch { + LeakDetector leakDetector; +} + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + +// end catch_impl.hpp +#endif + +#ifdef CATCH_CONFIG_MAIN +// start catch_default_main.hpp + +#ifndef __OBJC__ + +#if defined(CATCH_CONFIG_WCHAR) && defined(CATCH_PLATFORM_WINDOWS) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) +// Standard C/C++ Win32 Unicode wmain entry point +extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { +#else +// Standard C/C++ main entry point +int main (int argc, char * argv[]) { +#endif + + return Catch::Session().run( argc, argv ); +} + +#else // __OBJC__ + +// Objective-C entry point +int main (int argc, char * const argv[]) { +#if !CATCH_ARC_ENABLED + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; +#endif + + Catch::registerTestMethods(); + int result = Catch::Session().run( argc, (char**)argv ); + +#if !CATCH_ARC_ENABLED + [pool drain]; +#endif + + return result; +} + +#endif // __OBJC__ + +// end catch_default_main.hpp +#endif + +#if !defined(CATCH_CONFIG_IMPL_ONLY) + +#ifdef CLARA_CONFIG_MAIN_NOT_DEFINED +# undef CLARA_CONFIG_MAIN +#endif + +#if !defined(CATCH_CONFIG_DISABLE) +////// +// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ +#ifdef CATCH_CONFIG_PREFIX_ALL + +#define CATCH_REQUIRE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define CATCH_REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) + +#define CATCH_REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr ) +#endif// CATCH_CONFIG_DISABLE_MATCHERS +#define CATCH_REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ ) + +#define CATCH_CHECK( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) +#define CATCH_CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ ) + +#define CATCH_CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define CATCH_CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) + +#define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +#define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) +#define CATCH_UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( "CATCH_UNSCOPED_INFO", msg ) +#define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define CATCH_CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CATCH_CAPTURE",__VA_ARGS__ ) + +#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) +#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) +#define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) +#define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) +#define CATCH_DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ ) +#define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) + +#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) +#else +#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) +#endif + +#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) +#define CATCH_STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__ , #__VA_ARGS__ ); CATCH_SUCCEED( #__VA_ARGS__ ) +#define CATCH_STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); CATCH_SUCCEED( #__VA_ARGS__ ) +#else +#define CATCH_STATIC_REQUIRE( ... ) CATCH_REQUIRE( __VA_ARGS__ ) +#define CATCH_STATIC_REQUIRE_FALSE( ... ) CATCH_REQUIRE_FALSE( __VA_ARGS__ ) +#endif + +// "BDD-style" convenience wrappers +#define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) +#define CATCH_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc ) +#define CATCH_AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And given: " << desc ) +#define CATCH_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc ) +#define CATCH_AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And when: " << desc ) +#define CATCH_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) +#define CATCH_AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +#define CATCH_BENCHMARK(...) \ + INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) +#define CATCH_BENCHMARK_ADVANCED(name) \ + INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name) +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + +// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required +#else + +#define REQUIRE( ... ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) + +#define REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) +#define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ ) + +#define CHECK( ... ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) +#define CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ ) + +#define CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) +#define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) + +#define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +#define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) +#define UNSCOPED_INFO( msg ) INTERNAL_CATCH_UNSCOPED_INFO( "UNSCOPED_INFO", msg ) +#define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) +#define CAPTURE( ... ) INTERNAL_CATCH_CAPTURE( INTERNAL_CATCH_UNIQUE_NAME(capturer), "CAPTURE",__VA_ARGS__ ) + +#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) +#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) +#define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) +#define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) +#define DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ ) +#define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) +#define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) +#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) +#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) +#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__) +#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#else +#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) ) +#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) ) +#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE( __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) +#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE( __VA_ARGS__ ) ) +#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) +#endif + +#if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) +#define STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__, #__VA_ARGS__ ); SUCCEED( #__VA_ARGS__ ) +#define STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); SUCCEED( "!(" #__VA_ARGS__ ")" ) +#else +#define STATIC_REQUIRE( ... ) REQUIRE( __VA_ARGS__ ) +#define STATIC_REQUIRE_FALSE( ... ) REQUIRE_FALSE( __VA_ARGS__ ) +#endif + +#endif + +#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) + +// "BDD-style" convenience wrappers +#define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) +#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) + +#define GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc ) +#define AND_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And given: " << desc ) +#define WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc ) +#define AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And when: " << desc ) +#define THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) +#define AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) + +#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) +#define BENCHMARK(...) \ + INTERNAL_CATCH_BENCHMARK(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), INTERNAL_CATCH_GET_1_ARG(__VA_ARGS__,,), INTERNAL_CATCH_GET_2_ARG(__VA_ARGS__,,)) +#define BENCHMARK_ADVANCED(name) \ + INTERNAL_CATCH_BENCHMARK_ADVANCED(INTERNAL_CATCH_UNIQUE_NAME(____C_A_T_C_H____B_E_N_C_H____), name) +#endif // CATCH_CONFIG_ENABLE_BENCHMARKING + +using Catch::Detail::Approx; + +#else // CATCH_CONFIG_DISABLE + +////// +// If this config identifier is defined then all CATCH macros are prefixed with CATCH_ +#ifdef CATCH_CONFIG_PREFIX_ALL + +#define CATCH_REQUIRE( ... ) (void)(0) +#define CATCH_REQUIRE_FALSE( ... ) (void)(0) + +#define CATCH_REQUIRE_THROWS( ... ) (void)(0) +#define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0) +#define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) (void)(0) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) +#endif// CATCH_CONFIG_DISABLE_MATCHERS +#define CATCH_REQUIRE_NOTHROW( ... ) (void)(0) + +#define CATCH_CHECK( ... ) (void)(0) +#define CATCH_CHECK_FALSE( ... ) (void)(0) +#define CATCH_CHECKED_IF( ... ) if (__VA_ARGS__) +#define CATCH_CHECKED_ELSE( ... ) if (!(__VA_ARGS__)) +#define CATCH_CHECK_NOFAIL( ... ) (void)(0) + +#define CATCH_CHECK_THROWS( ... ) (void)(0) +#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) (void)(0) +#define CATCH_CHECK_THROWS_WITH( expr, matcher ) (void)(0) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define CATCH_CHECK_NOTHROW( ... ) (void)(0) + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CATCH_CHECK_THAT( arg, matcher ) (void)(0) + +#define CATCH_REQUIRE_THAT( arg, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +#define CATCH_INFO( msg ) (void)(0) +#define CATCH_UNSCOPED_INFO( msg ) (void)(0) +#define CATCH_WARN( msg ) (void)(0) +#define CATCH_CAPTURE( msg ) (void)(0) + +#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define CATCH_METHOD_AS_TEST_CASE( method, ... ) +#define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0) +#define CATCH_SECTION( ... ) +#define CATCH_DYNAMIC_SECTION( ... ) +#define CATCH_FAIL( ... ) (void)(0) +#define CATCH_FAIL_CHECK( ... ) (void)(0) +#define CATCH_SUCCEED( ... ) (void)(0) + +#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) +#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) +#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__) +#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#else +#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) ) +#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#endif + +// "BDD-style" convenience wrappers +#define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) +#define CATCH_GIVEN( desc ) +#define CATCH_AND_GIVEN( desc ) +#define CATCH_WHEN( desc ) +#define CATCH_AND_WHEN( desc ) +#define CATCH_THEN( desc ) +#define CATCH_AND_THEN( desc ) + +#define CATCH_STATIC_REQUIRE( ... ) (void)(0) +#define CATCH_STATIC_REQUIRE_FALSE( ... ) (void)(0) + +// If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required +#else + +#define REQUIRE( ... ) (void)(0) +#define REQUIRE_FALSE( ... ) (void)(0) + +#define REQUIRE_THROWS( ... ) (void)(0) +#define REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0) +#define REQUIRE_THROWS_WITH( expr, matcher ) (void)(0) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define REQUIRE_NOTHROW( ... ) (void)(0) + +#define CHECK( ... ) (void)(0) +#define CHECK_FALSE( ... ) (void)(0) +#define CHECKED_IF( ... ) if (__VA_ARGS__) +#define CHECKED_ELSE( ... ) if (!(__VA_ARGS__)) +#define CHECK_NOFAIL( ... ) (void)(0) + +#define CHECK_THROWS( ... ) (void)(0) +#define CHECK_THROWS_AS( expr, exceptionType ) (void)(0) +#define CHECK_THROWS_WITH( expr, matcher ) (void)(0) +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS +#define CHECK_NOTHROW( ... ) (void)(0) + +#if !defined(CATCH_CONFIG_DISABLE_MATCHERS) +#define CHECK_THAT( arg, matcher ) (void)(0) + +#define REQUIRE_THAT( arg, matcher ) (void)(0) +#endif // CATCH_CONFIG_DISABLE_MATCHERS + +#define INFO( msg ) (void)(0) +#define UNSCOPED_INFO( msg ) (void)(0) +#define WARN( msg ) (void)(0) +#define CAPTURE( msg ) (void)(0) + +#define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) +#define METHOD_AS_TEST_CASE( method, ... ) +#define REGISTER_TEST_CASE( Function, ... ) (void)(0) +#define SECTION( ... ) +#define DYNAMIC_SECTION( ... ) +#define FAIL( ... ) (void)(0) +#define FAIL_CHECK( ... ) (void)(0) +#define SUCCEED( ... ) (void)(0) +#define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) +#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) +#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__) +#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#else +#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__) ) +#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__) ) +#define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__ ) ) +#define TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION(className, __VA_ARGS__ ) ) +#define TEMPLATE_PRODUCT_TEST_CASE( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) TEMPLATE_TEST_CASE( __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) +#endif + +#define STATIC_REQUIRE( ... ) (void)(0) +#define STATIC_REQUIRE_FALSE( ... ) (void)(0) + +#endif + +#define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) + +// "BDD-style" convenience wrappers +#define SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) ) +#define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) + +#define GIVEN( desc ) +#define AND_GIVEN( desc ) +#define WHEN( desc ) +#define AND_WHEN( desc ) +#define THEN( desc ) +#define AND_THEN( desc ) + +using Catch::Detail::Approx; + +#endif + +#endif // ! CATCH_CONFIG_IMPL_ONLY + +// start catch_reenable_warnings.h + + +#ifdef __clang__ +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(pop) +# else +# pragma clang diagnostic pop +# endif +#elif defined __GNUC__ +# pragma GCC diagnostic pop +#endif + +// end catch_reenable_warnings.h +// end catch.hpp +#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED + diff --git a/cmake/AddExample.cmake b/cmake/AddExample.cmake new file mode 100644 index 0000000..2e2cf8e --- /dev/null +++ b/cmake/AddExample.cmake @@ -0,0 +1,18 @@ +function(ADD_EXAMPLE target_name ) + message(STATUS "-----------") + + #++++++++++++++++++++++++++ + #| CPP TARGETS | + #++++++++++++++++++++++++++ + + message(STATUS "Adding target ${target_name}. Executable file name: ${target_name}") + + add_executable("${target_name}" "${target_name}.cpp") + + set_target_properties( "${target_name}") + + target_link_libraries( "${target_name}" -lm) + + add_dependencies(examples "${target_name}") + +endfunction(ADD_EXAMPLE) diff --git a/cmake/FindRandomIterator.cmake b/cmake/FindRandomIterator.cmake new file mode 100644 index 0000000..d807831 --- /dev/null +++ b/cmake/FindRandomIterator.cmake @@ -0,0 +1,87 @@ +#/*---------------------------------------------------------------------------- +# * +# * Copyright (C) 2021 Antonio Augusto Alves Junior +# * +# * This file is part of RandomIterator. +# * +# * RandomIterator is free software: you can redistribute it and/or modify +# * it under the terms of the GNU General Public License as published by +# * the Free Software Foundation, either version 3 of the License, or +# * (at your option) any later version. +# * +# * RandomIterator is distributed in the hope that it will be useful, +# * but WITHOUT ANY WARRANTY; without even the implied warranty of +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# * GNU General Public License for more details. +# * +# * You should have received a copy of the GNU General Public License +# * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. +# * +# *---------------------------------------------------------------------------*/ + +# +# FindHydra +# +# This module tries to find the Hydra header files and extrats their version. It +# sets the following variables. +# +# RandomIterator_FOUND - Set ON if Hydra headers are found, otherwise OFF. +# +# RandomIterator_INCLUDE_DIR - Include directory for hydra header files. (All header +# files will actually be in the hydra subdirectory.) +# RandomIterator_VERSION - Version of hydra in the form "major.minor.patch". +# + +find_path( RandomIterator_INCLUDE_DIR + PATHS + ${CMAKE_SOURCE_DIR} + /usr/include + /usr/local/include + ${RandomIterator_ROOT_DIR} + NAMES random_iterator/RandomIterator.h + DOC "RandomIterator headers" + ) + + +if( RandomIterator_INCLUDE_DIR ) + list( REMOVE_DUPLICATES RandomIterator_INCLUDE_DIR ) +endif( RandomIterator_INCLUDE_DIR ) + +# Find hydra version +if (RandomIterator_INCLUDE_DIR) + file( STRINGS ${RandomIterator_INCLUDE_DIR}/random_iterator/RandomIterator.h + version + REGEX "#define RandomIterator_VERSION[ \t]+([0-9x]+)" + ) + string( REGEX REPLACE + "#define RandomIterator_VERSION[ \t]+" + "" + version + "${version}" + ) + + string( REGEX MATCH "^[0-9]" major ${version} ) + string( REGEX REPLACE "^${major}00" "" version "${version}" ) + string( REGEX MATCH "^[0-9]" minor ${version} ) + string( REGEX REPLACE "^${minor}0" "" version "${version}" ) + set( RandomIterator_VERSION "${major}.${minor}.${version}") + set( RandomIterator_MAJOR_VERSION "${major}") + set( RandomIterator_MINOR_VERSION "${minor}") +endif() + +# Check for required components +include( FindPackageHandleStandardArgs ) +find_package_handle_standard_args( RandomIterator + FOUND_VAR RandomIterator_FOUND + REQUIRED_VARS RandomIterator_INCLUDE_DIR + VERSION_VAR RandomIterator_VERSION + FAIL_MESSAGE "RandomIterator could not be found.\ +Install RandomIterator and set RandomIterator_ROOT_DIR to point to the headers adding \ + '-DRandomIterator_ROOT_DIR=<path to random_iterator>'in the cmake command." + ) + +if(RandomIterator_FOUND) + set(RandomIterator_INCLUDE_DIRS ${RandomIterator_INCLUDE_DIR}) +endif() + +mark_as_advanced(RandomIterator_INCLUDE_DIR) diff --git a/cmake/FindTCLAP.cmake b/cmake/FindTCLAP.cmake new file mode 100644 index 0000000..f4590f2 --- /dev/null +++ b/cmake/FindTCLAP.cmake @@ -0,0 +1,35 @@ +# - Find TCLAP +# Find the TCLAP headers +# +# TCLAP_INCLUDE_DIR - where to find the TCLAP headers +# TCLAP_FOUND - True if TCLAP is found + +if (TCLAP_INCLUDE_DIR) + # already in cache, be silent + set (TCLAP_FIND_QUIETLY TRUE) +endif (TCLAP_INCLUDE_DIR) + +# find the headers +find_path (TCLAP_INCLUDE_PATH tclap/CmdLine.h + PATHS + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_INSTALL_PREFIX}/include + ) + +# handle the QUIETLY and REQUIRED arguments and set TCLAP_FOUND to +# TRUE if all listed variables are TRUE +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (TCLAP +FOUND_VAR TCLAP_FOUND +REQUIRED_VARS TCLAP_INCLUDE_PATH +FAIL_MESSAGE "TCLAP could not be found.\ +Install TCLAP from your distribution's repository or from 'http://tclap.sourceforge.net/'\ + and set TCLAP_INCLUDE_PATH to point to the headers adding \ + '-DTCLAP_INCLUDE_PATH=path_to_tclap_dir' to the cmake command." +) + +if (TCLAP_FOUND) + set (TCLAP_INCLUDE_DIR ${TCLAP_INCLUDE_PATH}) +endif (TCLAP_FOUND) + +mark_as_advanced(TCLAP_INCLUDE_DIR) diff --git a/cmake/FindTestU01.cmake b/cmake/FindTestU01.cmake new file mode 100644 index 0000000..af7a045 --- /dev/null +++ b/cmake/FindTestU01.cmake @@ -0,0 +1,118 @@ +# TestU01: http://www.iro.umontreal.ca/~simardr/testu01/tu01.html +# +# TESTU01_FOUND - System has TestU01 +# TESTU01_INCLUDE_DIRS - The TestU01 include directories +# TESTU01_LIBRARIES - The libraries needed to use TestU01 +# +# Set TESTU01_ROOT before calling find_package to a path to add an additional +# search path, e.g., +# +# Usage: +# +# set(TESTU01_ROOT "/path/to/custom/testu01") # prefer over system +# find_package(TestU01) +# if(TESTU01_FOUND) +# target_link_libraries (TARGET ${TESTU01_LIBRARIES}) +# endif() + +# If already in cache, be silent +if(TESTU01_INCLUDE_DIRS AND TESTU01_LIBRARIES) + set (TESTU01_FIND_QUIETLY TRUE) +endif() + +if(NOT DEFINED TESTU01_ROOT) +set(TESTU01_ROOT "/usr") +endif() + + +find_path(TESTU01_INCLUDE_SRES NAMES sres.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_SSTRING NAMES sstring.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_SKNUTH NAMES sknuth.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_SWALK NAMES swalk.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_SMARSA NAMES smarsa.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_SCOMP NAMES scomp.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_SSPECTRAL NAMES sspectral.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_UNIF01 NAMES unif01.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_SNPAIR NAMES snpair.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_GDEF NAMES gdef.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_GOFW NAMES gofw.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_SVARIA NAMES svaria.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) +find_path(TESTU01_INCLUDE_SWRITE NAMES swrite.h + HINTS ${TESTU01_ROOT}/include + $ENV{TESTU01_ROOT}/include) + +set(TESTU01_INCLUDE_DIRS ${TESTU01_INCLUDE_SRES} + ${TESTU01_INCLUDE_SSTRING} + ${TESTU01_INCLUDE_SKNUTH} + ${TESTU01_INCLUDE_SWALK} + ${TESTU01_INCLUDE_SMARSA} + ${TESTU01_INCLUDE_SCOMP} + ${TESTU01_INCLUDE_SSPECTRAL} + ${TESTU01_INCLUDE_UNIF01} + ${TESTU01_INCLUDE_SNPAIR} + ${TESTU01_INCLUDE_GDEF} + ${TESTU01_INCLUDE_GOFW} + ${TESTU01_INCLUDE_SVARIA} + ${TESTU01_INCLUDE_SWRITE}) + +list(REMOVE_DUPLICATES TESTU01_INCLUDE_DIRS) + +if(NOT BUILD_SHARED_LIBS) + find_library(TESTU01_LIBRARY NAMES libtestu01.so HINTS ${TESTU01_ROOT}/lib64 + $ENV{TESTU01_ROOT}/lib64) + find_library(TESTU01_PROBDIST_LIBRARY NAMES libprobdist.so + HINTS ${TESTU01_ROOT}/lib64 + $ENV{TESTU01_ROOT}/lib64) + find_library(TESTU01_MYLIB_LIBRARY NAMES libmylib.so + HINTS ${TESTU01_ROOT}/lib64 + $ENV{TESTU01_ROOT}/lib64) +else() + find_library(TESTU01_LIBRARY NAMES testu01 HINTS ${TESTU01_ROOT}/lib64 + $ENV{TESTU01_ROOT}/lib64) + find_library(TESTU01_PROBDIST_LIBRARY NAMES probdist + HINTS ${TESTU01_ROOT}/lib64 + $ENV{TESTU01_ROOT}/lib64) + find_library(TESTU01_MYLIB_LIBRARY NAMES mylib + HINTS ${TESTU01_ROOT}/lib64 + $ENV{TESTU01_ROOT}/lib64) +endif() + +set(TESTU01_LIBRARIES ${TESTU01_LIBRARY} ${TESTU01_PROBDIST_LIBRARY} + ${TESTU01_MYLIB_LIBRARY}) + +# Handle the QUIETLY and REQUIRED arguments and set TESTU01_FOUND to TRUE if +# all listed variables are TRUE. +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(TestU01 DEFAULT_MSG TESTU01_LIBRARIES TESTU01_INCLUDE_DIRS) + +if(NOT TestU01_FOUND) + set(TESTU01_INCLUDE_DIRS "") + set(TESTU01_LIBRARIES "") +endif() + +MARK_AS_ADVANCED(TESTU01_INCLUDE_DIRS TESTU01_LIBRARIES) + diff --git a/random_iterator/Engine.hpp b/random_iterator/Engine.hpp new file mode 100644 index 0000000..03970fb --- /dev/null +++ b/random_iterator/Engine.hpp @@ -0,0 +1,223 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ + +/* + * Engine.hpp + * + * Created on: 22 de fev. de 2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <limits> +#include <random_iterator/detail/EngineTraits.hpp> +#include <random_iterator/detail/SplitMix.hpp> +#include <random_iterator/detail/Squares3.hpp> +#include <random_iterator/detail/Squares4.hpp> + +namespace random_iterator { + +template<typename Engine123> +class Engine{ + + typedef unsigned trigger_type; + +public: + + typedef Engine123 engine_type; + typedef typename detail::random_traits<engine_type>::state_type state_type; + typedef typename detail::random_traits<engine_type>::seed_type seed_type; + typedef typename detail::random_traits<engine_type>::advance_type advance_type; + typedef typename detail::random_traits<engine_type>::init_type init_type; + typedef typename detail::random_traits<engine_type>::result_type result_type; + + static const unsigned arity = detail::random_traits<engine_type>::arity; + + Engine()=delete; + + Engine(result_type seed): + engine_(engine_type{}), + cache_(state_type{}), + state_(state_type{}), + seed_(seed_type{}), + trigger_(arity) + { + init_type temp{{}}; + + for(unsigned i=0; i< temp.size(); ++i){ + temp[i]=detail::splitmix<result_type>(seed); + } + + seed_ = temp; + } + + Engine(result_type seed, uint32_t stream ): + engine_(engine_type{}), + cache_(state_type{}), + state_(state_type{}), + seed_(seed_type{}), + trigger_(arity) + { + init_type temp{{}}; + + for(unsigned i=0; i< temp.size(); ++i){ + temp[i]=detail::splitmix<result_type>(seed); + } + + state_[arity-1] = stream; + state_[arity-1] << 32; + + seed_ = temp; + } + + Engine(init_type seed): + engine_(engine_type{}), + cache_(state_type{}), + state_(state_type{}), + seed_(seed), + trigger_(arity) + {} + + + Engine(init_type seed , uint32_t stream): + engine_(engine_type{}), + cache_(state_type{}), + state_(state_type{}), + seed_(seed), + trigger_(arity) + { + state_[arity-1] = stream; + state_[arity-1] << 32; + + } + + Engine( Engine<Engine123> const& other): + engine_(engine_type{} ), + cache_(other.getCache()), + state_(other.getState()), + seed_(other.getSeed() ), + trigger_(other.getTrigger()) + {} + + inline Engine<Engine123>& + operator=( Engine<Engine123> const& other) + { + + if(this==&other) return *this; + + engine_ = engine_type{}; + cache_ = other.getCache(); + state_ = other.getState(); + seed_ = other.getSeed(); + trigger_ = other.getTrigger(); + return *this; + } + + inline result_type operator()(void) + { + result_type result = 0; + + if(trigger_==arity){ + + trigger_=0; + cache_ = engine_(state_.incr(), seed_); + result = cache_[trigger_]; + ++trigger_; + } + else { + result = cache_[trigger_]; + ++trigger_; + } + + return result; + } + + inline void discard( advance_type n){ + + state_.incr(n); + trigger_=arity; + } + + inline void reset(void) { + trigger_ = arity; + state_ = state_type{}; + cache_ = state_type{}; + } + + inline const seed_type& getSeed() const { + return seed_; + } + + inline void setSeed(seed_type seed) { + seed_ = seed; + } + + inline void setSeed(result_type seed) { + + init_type temp{{}}; + for(unsigned i=0; i< temp.size(); ++i){ + temp[i]=detail::splitmix<result_type>(seed); + } + seed_ = temp; + } + + inline const state_type& getState() const { + return state_; + } + + inline void setState(const state_type& state) { + state_ = state; + } + + static constexpr result_type min() { return 0;} + + static constexpr result_type max() { return std::numeric_limits<result_type>::max(); } + +private: + + inline state_type getCache() const { + return cache_; + } + + inline trigger_type getTrigger() const { + return trigger_; + } + + engine_type engine_; + state_type cache_; + state_type state_; + seed_type seed_; + trigger_type trigger_; +}; + +typedef Engine<random_iterator_r123::Philox2x64> philox; +typedef Engine<random_iterator_r123::Threefry2x64> threefry; +typedef detail::Squares3 squares3; +typedef detail::Squares4 squares4; + +#if RANDOM_ITERATOR_R123_USE_AES_NI +typedef Engine<random_iterator_r123::ARS4x32> ars; +#endif + +} // namespace random_iterator + + diff --git a/random_iterator/RandomIterator.h b/random_iterator/RandomIterator.h new file mode 100644 index 0000000..d14af1f --- /dev/null +++ b/random_iterator/RandomIterator.h @@ -0,0 +1,81 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ + +/* + * RandomIterator.h + * + * Created on: 21/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +// This is the only RandomIterator header that is guaranteed to +// change with every RandomIterator release. +// +// RandomIterator_VERSION % 100 is the sub-minor version +// RandomIterator_VERSION / 100 % 1000 is the minor version +// RandomIterator_VERSION / 100000 is the major version +// +// Because this header does not #include <RandomIterator/detail/Config.h>, +// it is the only RandomIterator header that does not cause +// RandomIterator_HOST_SYSTEM and RandomIterator_DEVICE_SYSTEM to be defined. + +/*! \def RandomIterator_VERSION + * \brief The preprocessor macro \p RandomIterator_VERSION encodes the version + * number of the RandomIterator. + * + * <tt>RandomIterator_VERSION % 100</tt> is the patch version. + * <tt>RandomIterator_VERSION / 100 % 1000</tt> is the feature version. + * <tt>RandomIterator_VERSION / 100000</tt> is the major version. + */ +#define RandomIterator_VERSION 100000 + + +/*! \def RandomIterator_MAJOR_VERSION + * \brief The preprocessor macro \p RandomIterator_MAJOR_VERSION encodes the + * major version number of RandomIterator. + */ +#define RandomIterator_MAJOR_VERSION (RandomIterator_VERSION / 100000) + +/*! \def RandomIterator_MINOR_VERSION + * \brief The preprocessor macro \p RandomIterator_MINOR_VERSION encodes the + * minor version number of RandomIterator. + */ +#define RandomIterator_MINOR_VERSION (RandomIterator_VERSION / 100 % 1000) + +/*! \def RandomIterator_PATCH_NUMBER + * \brief The preprocessor macro \p RandomIterator_PATCH_NUMBER encodes the + * patch number of the RandomIterator library. + */ +#define RandomIterator_PATCH_NUMBER 0 + + + +// Declare these namespaces here for the purpose of Doxygenating them + +/*! \RandomIterator_EXTERNAL_NAMESPACE_BEGIN namespace thrust + * \brief \p thrust is the top-level namespace which contains all RandomIterator + * functions and types. + */ +namespace random_iterator{ } + + diff --git a/random_iterator/Stream.hpp b/random_iterator/Stream.hpp new file mode 100644 index 0000000..1c51802 --- /dev/null +++ b/random_iterator/Stream.hpp @@ -0,0 +1,148 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * Stream.hpp + * + * Created on: 23/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include <random_iterator/detail/tbb/iterators.h> +#include <random_iterator/Engine.hpp> +#include <random_iterator/detail/functors/EngineCaller.hpp> + +namespace random_iterator { + +template<typename DistibutionType, typename EngineType> +class Stream +{ + +public: + + typedef EngineType engine_type; + typedef typename engine_type::state_type state_type; + typedef typename engine_type::seed_type seed_type; + typedef typename engine_type::advance_type advance_type; + typedef typename engine_type::init_type init_type; + + typedef DistibutionType distribution_type; + typedef typename distribution_type::result_type result_type; + + typedef detail::EngineCaller<DistibutionType,EngineType> caller_type; + typedef random_iterator_tbb::counting_iterator<advance_type> counting_iterator; + typedef random_iterator_tbb::transform_iterator< caller_type, counting_iterator> iterator; + + Stream()=delete; + + Stream(distribution_type const& dist, seed_type seed, uint32_t stream =1): + distribution_(dist), + engine_(seed, stream), + seed_(seed), + stream_(stream) + {} + + Stream( Stream<DistibutionType,EngineType> const& other ): + distribution_(other.getDistribution()), + engine_(other.getEngine()), + seed_(other.getSeed()), + stream_(other.getStream()) + {} + + inline iterator begin() const{ + + counting_iterator first( 0); + caller_type caller(distribution_, seed_, stream_ ); + + return iterator(first, caller); + } + + inline iterator end() const{ + + counting_iterator last(std::numeric_limits<advance_type>::max()); + caller_type caller(distribution_, seed_, stream_ ); + + return iterator(last, caller) ; + } + + inline result_type operator[](advance_type n) const{ + + caller_type caller(distribution_, seed_, stream_ ); + + return caller(n); + } + + inline result_type operator()(void){ + + return distribution_(engine_); + } + + inline distribution_type getDistribution() const { + return distribution_; + } + + inline void setDistribution(distribution_type dist) { + distribution_ = dist; + } + + inline engine_type getEngine() const { + return engine_; + } + + inline void setEngine(engine_type engine) { + engine_ = engine; + } + + inline const seed_type& getSeed() const { + return seed_; + } + + inline void setSeed(const seed_type& seed) { + seed_ = seed; + } + + inline uint32_t getStream() const { + return stream_; + } + + inline void setStream(uint32_t stream) { + stream_ = stream; + } + +private: + + distribution_type distribution_; + engine_type engine_; + seed_type seed_; + uint32_t stream_; + +}; + +template<typename DistibutionType, typename EngineType> +Stream<DistibutionType, EngineType> +make_stream( DistibutionType const& dist, EngineType eng, uint32_t stream ){ + + return Stream<DistibutionType, EngineType>( dist, eng.getSeed(), stream); +} + +} // namespace random_iterator diff --git a/random_iterator/detail/EngineTraits.hpp b/random_iterator/detail/EngineTraits.hpp new file mode 100644 index 0000000..0d64603 --- /dev/null +++ b/random_iterator/detail/EngineTraits.hpp @@ -0,0 +1,115 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ + +/* + * EngineTraits.hpp + * + * Created on: 23 de fev. de 2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include <random_iterator/detail/Random123/array.h> +#include <random_iterator/detail/Random123/philox.h> +#include <random_iterator/detail/Random123/threefry.h> +#include <random_iterator/detail/Random123/ars.h> +#include <random_iterator/detail/Random123/ReinterpretCtr.hpp> + + +namespace random_iterator { + +namespace detail { + + +template<typename Engine> +struct random_traits; +/* + * random_traits<T>::state_type { counter, state} + * random_traits<T>::advance_type; + * random_traits<T>::init_type; + * random_traits<T>::result_type; + */ + +//philox +template<> struct random_traits<random_iterator_r123::Philox2x64> +{ + typedef typename random_iterator_r123::Philox2x64::ctr_type state_type; + typedef typename random_iterator_r123::Philox2x64::key_type seed_type; + typedef typename random_iterator_r123::Philox2x64::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=2}; +}; + +template<> struct random_traits<random_iterator_r123::Philox4x64> +{ + typedef typename random_iterator_r123::Philox4x64::ctr_type state_type; + typedef typename random_iterator_r123::Philox4x64::key_type seed_type; + typedef typename random_iterator_r123::Philox4x64::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=4}; +}; +// +template<> struct random_traits<random_iterator_r123::Threefry2x64> +{ + typedef typename random_iterator_r123::Threefry2x64::ctr_type state_type; + typedef typename random_iterator_r123::Threefry2x64::key_type seed_type; + typedef typename random_iterator_r123::Threefry2x64::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=2}; +}; + +// +template<> struct random_traits<random_iterator_r123::Threefry4x64> +{ + typedef typename random_iterator_r123::Threefry4x64::ctr_type state_type; + typedef typename random_iterator_r123::Threefry4x64::key_type seed_type; + typedef typename random_iterator_r123::Threefry4x64::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=4}; +}; + + +#if RANDOM_ITERATOR_R123_USE_AES_NI +template<> struct random_traits<random_iterator_r123::ARS4x32> +{ + typedef typename random_iterator_r123::ARS4x32::ctr_type state_type; + typedef typename random_iterator_r123::ARS4x32::key_type seed_type; + typedef typename random_iterator_r123::ARS4x32::ukey_type init_type; + typedef uint64_t advance_type; + typedef state_type::value_type result_type; + + enum{arity=4}; +}; +#endif + +} // namespace detail + +} // namespace random_iterator diff --git a/random_iterator/detail/Random123/MicroURNG.hpp b/random_iterator/detail/Random123/MicroURNG.hpp new file mode 100644 index 0000000..e49cb71 --- /dev/null +++ b/random_iterator/detail/Random123/MicroURNG.hpp @@ -0,0 +1,146 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __MicroURNG_dot_hpp__ +#define __MicroURNG_dot_hpp__ + +#include <stdexcept> +#include <limits> + +namespace random_iterator_r123{ +/** + Given a CBRNG whose ctr_type has an unsigned integral value_type, + MicroURNG<CBRNG>(c, k) is a type that satisfies the + requirements of a C++11 Uniform Random Number Generator. + + The intended purpose is for a MicroURNG to be passed + as an argument to a C++11 Distribution, e.g., + std::normal_distribution. See examples/MicroURNG.cpp. + + The MicroURNG functor has a period of "only" + + ctr_type.size()*2^32, + + after which it will silently repeat. + + The high 32 bits of the highest word in the counter c, passed to + the constructor must be zero. MicroURNG uses these bits to + "count". + + Older versions of the library permitted a second template + parameter by which the caller could control the number of + bits devoted to the URNG's internal counter. This flexibility + has been disabled because URNGs created with different + numbers of counter bits could, conceivably "collide". + +\code + typedef ?someCBRNG? RNG; + RNG::ctr_type c = ...; // under application control + RNG::key_type k = ...; // + std::normal_distribution<float> nd; + MicroURNG<RNG> urng(c, k); + for(???){ + ... + nd(urng); // may be called several hundred times with BITS=10 + ... + } +\endcode +*/ + +template<typename CBRNG> +class MicroURNG{ + // According to C++11, a URNG requires only a result_type, + // operator()(), min() and max() methods. Everything else + // (ctr_type, key_type, reset() method, etc.) is "value added" + // for the benefit of users that "know" that they're dealing with + // a MicroURNG. +public: + typedef CBRNG cbrng_type; + static const int BITS = 32; + typedef typename cbrng_type::ctr_type ctr_type; + typedef typename cbrng_type::key_type key_type; + typedef typename cbrng_type::ukey_type ukey_type; + typedef typename ctr_type::value_type result_type; + + RANDOM_ITERATOR_R123_STATIC_ASSERT( std::numeric_limits<result_type>::digits >= BITS, "The result_type must have at least 32 bits" ); + + result_type operator()(){ + if(last_elem == 0){ + // jam n into the high bits of c + const size_t W = std::numeric_limits<result_type>::digits; + ctr_type c = c0; + c[c0.size()-1] |= n<<(W-BITS); + rdata = b(c,k); + n++; + last_elem = rdata.size(); + } + return rdata[--last_elem]; + } + MicroURNG(cbrng_type _b, ctr_type _c0, ukey_type _uk) : b(_b), c0(_c0), k(_uk), n(0), last_elem(0) { + chkhighbits(); + } + MicroURNG(ctr_type _c0, ukey_type _uk) : b(), c0(_c0), k(_uk), n(0), last_elem(0) { + chkhighbits(); + } + + // _Min and _Max work around a bug in the library shipped with MacOS Xcode 4.5.2. + // See the commment in conventional/Engine.hpp. + const static result_type _Min = 0; + const static result_type _Max = ~((result_type)0); + + static RANDOM_ITERATOR_R123_CONSTEXPR result_type min RANDOM_ITERATOR_R123_NO_MACRO_SUBST () { return _Min; } + static RANDOM_ITERATOR_R123_CONSTEXPR result_type max RANDOM_ITERATOR_R123_NO_MACRO_SUBST () { return _Max; } + // extra methods: + const ctr_type& counter() const{ return c0; } + void reset(ctr_type _c0, ukey_type _uk){ + c0 = _c0; + chkhighbits(); + k = _uk; + n = 0; + last_elem = 0; + } + +private: + cbrng_type b; + ctr_type c0; + key_type k; + RANDOM_ITERATOR_R123_ULONG_LONG n; + size_t last_elem; + ctr_type rdata; + void chkhighbits(){ + result_type r = c0[c0.size()-1]; + result_type mask = ((uint64_t)std::numeric_limits<result_type>::max RANDOM_ITERATOR_R123_NO_MACRO_SUBST ())>>BITS; + if((r&mask) != r) + throw std::runtime_error("MicroURNG: c0, does not have high bits clear"); + } +}; +} // namespace random_iterator_r123 +#endif diff --git a/random_iterator/detail/Random123/ReinterpretCtr.hpp b/random_iterator/detail/Random123/ReinterpretCtr.hpp new file mode 100644 index 0000000..9b4921f --- /dev/null +++ b/random_iterator/detail/Random123/ReinterpretCtr.hpp @@ -0,0 +1,88 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __ReinterpretCtr_dot_hpp__ +#define __ReinterpretCtr_dot_hpp__ + +#include "features/compilerfeatures.h" +#include <cstring> + +namespace random_iterator_r123{ +/*! + ReinterpretCtr uses memcpy to map back and forth + between a CBRNG's ctr_type and the specified ToType. For example, + after: + + typedef ReinterpretCtr<r123array4x32, Philox2x64> G; + + G is a bona fide CBRNG with ctr_type r123array4x32. + + WARNING: ReinterpretCtr is endian dependent. The + values returned by G, declared as above, + will depend on the endianness of the machine on which it runs. + */ + +template <typename ToType, typename CBRNG> +struct ReinterpretCtr{ + typedef ToType ctr_type; + typedef typename CBRNG::key_type key_type; + typedef typename CBRNG::ctr_type bctype; + typedef typename CBRNG::ukey_type ukey_type; + RANDOM_ITERATOR_R123_STATIC_ASSERT(sizeof(ToType) == sizeof(bctype) && sizeof(typename bctype::value_type) != 16, + "ReinterpretCtr: sizeof(ToType) is not the same as sizeof(CBRNG::ctr_type) or CBRNG::ctr_type::value_type looks like it might be __m128i"); + // It's amazingly difficult to safely do conversions with __m128i. + // If we use the operator() implementation below with a CBRNG + // whose ctr_type is r123array1xm128i, gcc4.6 optimizes away the + // memcpys, inlines the operator()(c,k), and produces assembly + // language that ends with an aesenclast instruction with a + // destination operand pointing to an unaligned memory address ... + // Segfault! See: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50444 + // MSVC also produces code that crashes. We suspect a + // similar mechanism but haven't done the debugging necessary to + // be sure. We were able to 'fix' gcc4.6 by making bc a mutable + // data member rather than declaring it in the scope of + // operator(). That didn't fix the MSVC problems, though. + // + // Conclusion - don't touch __m128i, at least for now. The + // easiest (but highly imprecise) way to do that is the static + // assertion above that rejects bctype::value_types of size 16. - + // Sep 2011. + ctr_type operator()(ctr_type c, key_type k){ + bctype bc; + std::memcpy(&bc, &c, sizeof(c)); + CBRNG b; + bc = b(bc, k); + std::memcpy(&c, &bc, sizeof(bc)); + return c; + } +}; +} // namespace random_iterator_r123 +#endif diff --git a/random_iterator/detail/Random123/aes.h b/random_iterator/detail/Random123/aes.h new file mode 100644 index 0000000..4d7c839 --- /dev/null +++ b/random_iterator/detail/Random123/aes.h @@ -0,0 +1,398 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __Random123_aes_dot_hpp__ +#define __Random123_aes_dot_hpp__ + +#include "features/compilerfeatures.h" +#include "array.h" + +/* Implement a bona fide AES block cipher. It's minimally +// checked against the test vector in FIPS-197 in ut_aes.cpp. */ +#if RANDOM_ITERATOR_R123_USE_AES_NI + +/** @ingroup AESNI */ +typedef struct r123array1xm128i aesni1xm128i_ctr_t; +/** @ingroup AESNI */ +typedef struct r123array1xm128i aesni1xm128i_ukey_t; +/** @ingroup AESNI */ +typedef struct r123array4x32 aesni4x32_ukey_t; +/** @ingroup AESNI */ +enum r123_enum_aesni1xm128i { aesni1xm128i_rounds = 10 }; + +/** \cond HIDDEN_FROM_DOXYGEN */ +RANDOM_ITERATOR_R123_STATIC_INLINE __m128i AES_128_ASSIST (__m128i temp1, __m128i temp2) { + __m128i temp3; + temp2 = _mm_shuffle_epi32 (temp2 ,0xff); + temp3 = _mm_slli_si128 (temp1, 0x4); + temp1 = _mm_xor_si128 (temp1, temp3); + temp3 = _mm_slli_si128 (temp3, 0x4); + temp1 = _mm_xor_si128 (temp1, temp3); + temp3 = _mm_slli_si128 (temp3, 0x4); + temp1 = _mm_xor_si128 (temp1, temp3); + temp1 = _mm_xor_si128 (temp1, temp2); + return temp1; +} + +RANDOM_ITERATOR_R123_STATIC_INLINE void aesni1xm128iexpand(aesni1xm128i_ukey_t uk, __m128i ret[11]) +{ + __m128i rkey = uk.v[0].m; + __m128i tmp2; + + ret[0] = rkey; + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[1] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x2); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[2] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x4); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[3] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x8); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[4] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x10); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[5] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x20); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[6] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x40); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[7] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x80); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[8] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x1b); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[9] = rkey; + + tmp2 = _mm_aeskeygenassist_si128(rkey, 0x36); + rkey = AES_128_ASSIST(rkey, tmp2); + ret[10] = rkey; +} +/** \endcond */ + +#ifdef __cplusplus +/** @ingroup AESNI */ +struct aesni1xm128i_key_t{ + __m128i k[11]; + aesni1xm128i_key_t(){ + aesni1xm128i_ukey_t uk; + uk.v[0].m = _mm_setzero_si128(); + aesni1xm128iexpand(uk, k); + } + aesni1xm128i_key_t(const aesni1xm128i_ukey_t& uk){ + aesni1xm128iexpand(uk, k); + } + aesni1xm128i_key_t(const aesni4x32_ukey_t& uk){ + aesni1xm128i_ukey_t uk128; + uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]); + aesni1xm128iexpand(uk128, k); + } + aesni1xm128i_key_t& operator=(const aesni1xm128i_ukey_t& uk){ + aesni1xm128iexpand(uk, k); + return *this; + } + aesni1xm128i_key_t& operator=(const aesni4x32_ukey_t& uk){ + aesni1xm128i_ukey_t uk128; + uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]); + aesni1xm128iexpand(uk128, k); + return *this; + } + bool operator==(const aesni1xm128i_key_t& rhs) const{ + for(int i=0; i<11; ++i){ + // Sigh... No r123m128i(__m128i) constructor! + r123m128i li; li.m = k[i]; + r123m128i ri; ri.m = rhs.k[i]; + if( li != ri ) return false; + } + return true; + } + bool operator!=(const aesni1xm128i_key_t& rhs) const{ + return !(*this == rhs); + } + friend std::ostream& operator<<(std::ostream& os, const aesni1xm128i_key_t& v){ + r123m128i ki; + for(int i=0; i<10; ++i){ + ki.m = v.k[i]; + os << ki << " "; + } + ki.m = v.k[10]; + return os << ki; + } + friend std::istream& operator>>(std::istream& is, aesni1xm128i_key_t& v){ + r123m128i ki; + for(int i=0; i<11; ++i){ + is >> ki; + v.k[i] = ki; + } + return is; + } +}; +#else +typedef struct { + __m128i k[11]; +}aesni1xm128i_key_t; + +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE aesni1xm128i_key_t aesni1xm128ikeyinit(aesni1xm128i_ukey_t uk){ + aesni1xm128i_key_t ret; + aesni1xm128iexpand(uk, ret.k); + return ret; +} +#endif + +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE aesni1xm128i_ctr_t aesni1xm128i(aesni1xm128i_ctr_t in, aesni1xm128i_key_t k) { + __m128i x = _mm_xor_si128(k.k[0], in.v[0].m); + x = _mm_aesenc_si128(x, k.k[1]); + x = _mm_aesenc_si128(x, k.k[2]); + x = _mm_aesenc_si128(x, k.k[3]); + x = _mm_aesenc_si128(x, k.k[4]); + x = _mm_aesenc_si128(x, k.k[5]); + x = _mm_aesenc_si128(x, k.k[6]); + x = _mm_aesenc_si128(x, k.k[7]); + x = _mm_aesenc_si128(x, k.k[8]); + x = _mm_aesenc_si128(x, k.k[9]); + x = _mm_aesenclast_si128(x, k.k[10]); + { + aesni1xm128i_ctr_t ret; + ret.v[0].m = x; + return ret; + } +} + +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE aesni1xm128i_ctr_t aesni1xm128i_R(unsigned R, aesni1xm128i_ctr_t in, aesni1xm128i_key_t k){ + RANDOM_ITERATOR_R123_ASSERT(R==10); + return aesni1xm128i(in, k); +} + + +/** @ingroup AESNI */ +typedef struct r123array4x32 aesni4x32_ctr_t; +/** @ingroup AESNI */ +typedef aesni1xm128i_key_t aesni4x32_key_t; +/** @ingroup AESNI */ +enum r123_enum_aesni4x32 { aesni4x32_rounds = 10 }; +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE aesni4x32_key_t aesni4x32keyinit(aesni4x32_ukey_t uk){ + aesni1xm128i_ukey_t uk128; + aesni4x32_key_t ret; + uk128.v[0].m = _mm_set_epi32(uk.v[3], uk.v[2], uk.v[1], uk.v[0]); + aesni1xm128iexpand(uk128, ret.k); + return ret; +} + +/** @ingroup AESNI */ +/** The aesni4x32_R function provides a C API to the @ref AESNI "AESNI" CBRNG, allowing the number of rounds to be specified explicitly **/ +RANDOM_ITERATOR_R123_STATIC_INLINE aesni4x32_ctr_t aesni4x32_R(unsigned int Nrounds, aesni4x32_ctr_t c, aesni4x32_key_t k){ + aesni1xm128i_ctr_t c128; + c128.v[0].m = _mm_set_epi32(c.v[3], c.v[2], c.v[1], c.v[0]); + c128 = aesni1xm128i_R(Nrounds, c128, k); + _mm_storeu_si128((__m128i*)&c.v[0], c128.v[0].m); + return c; +} + +#define aesni4x32_rounds aesni1xm128i_rounds + +/** The aesni4x32 macro provides a C API to the @ref AESNI "AESNI" CBRNG, uses the default number of rounds i.e. \c aesni4x32_rounds **/ +/** @ingroup AESNI */ +#define aesni4x32(c,k) aesni4x32_R(aesni4x32_rounds, c, k) + +#ifdef __cplusplus +namespace random_iterator_r123{ +/** +@defgroup AESNI ARS and AESNI Classes and Typedefs + +The ARS4x32, ARS1xm128i, AESNI4x32 and AESNI1xm128i classes export the member functions, typedefs and +operator overloads required by a @ref CBRNG "CBRNG" class. + +ARS1xm128i and AESNI1xm128i are based on the AES block cipher and rely on the AES-NI hardware instructions +available on some some new (2011) CPUs. + +The ARS1xm128i CBRNG and the use of AES for random number generation are described in +<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>. +Although it uses some cryptographic primitives, ARS1xm128i uses a cryptographically weak key schedule and is \b not suitable for cryptographic use. + +@class AESNI1xm128i +@ingroup AESNI +AESNI exports the member functions, typedefs and operator overloads required by a @ref CBRNG class. + +AESNI1xm128i uses the crypotgraphic AES round function, including the cryptographic key schedule. + +In contrast to the other CBRNGs in the Random123 library, the AESNI1xm128i_R::key_type is opaque +and is \b not identical to the AESNI1xm128i_R::ukey_type. Creating a key_type, using either the constructor +or assignment operator, is significantly more time-consuming than running the bijection (hundreds +of clock cycles vs. tens of clock cycles). + +AESNI1xm128i is only available when the feature-test macro RANDOM_ITERATOR_R123_USE_AES_NI is true, which +should occur only when the compiler is configured to generate AES-NI instructions (or +when defaults are overridden by compile-time, compiler-command-line options). + +As of September 2011, the authors know of no statistical flaws with AESNI1xm128i. It +would be an event of major cryptographic note if any such flaws were ever found. +*/ +struct AESNI1xm128i{ + typedef aesni1xm128i_ctr_t ctr_type; + typedef aesni1xm128i_ukey_t ukey_type; + typedef aesni1xm128i_key_t key_type; + static const unsigned int rounds=10; + ctr_type operator()(ctr_type ctr, key_type key) const{ + return aesni1xm128i(ctr, key); + } +}; + +/* @class AESNI4x32 */ +struct AESNI4x32{ + typedef aesni4x32_ctr_t ctr_type; + typedef aesni4x32_ukey_t ukey_type; + typedef aesni4x32_key_t key_type; + static const unsigned int rounds=10; + ctr_type operator()(ctr_type ctr, key_type key) const{ + return aesni4x32(ctr, key); + } +}; + +/** @ingroup AESNI + @class AESNI1xm128i_R + +AESNI1xm128i_R is provided for completeness, but is only instantiable with ROUNDS=10, in +which case it is identical to AESNI1xm128i */ +template <unsigned ROUNDS=10> +struct AESNI1xm128i_R : public AESNI1xm128i{ + RANDOM_ITERATOR_R123_STATIC_ASSERT(ROUNDS==10, "AESNI1xm128i_R<R> is only valid with R=10"); +}; + +/** @class AESNI4x32_R **/ +template <unsigned ROUNDS=10> +struct AESNI4x32_R : public AESNI4x32{ + RANDOM_ITERATOR_R123_STATIC_ASSERT(ROUNDS==10, "AESNI4x32_R<R> is only valid with R=10"); +}; +} // namespace random_iterator_r123 +#endif /* __cplusplus */ + +#endif /* RANDOM_ITERATOR_R123_USE_AES_NI */ + +#if RANDOM_ITERATOR_R123_USE_AES_OPENSSL +#include "string.h" +#include <openssl/aes.h> +typedef struct r123array16x8 aesopenssl16x8_ctr_t; +typedef struct r123array16x8 aesopenssl16x8_ukey_t; +#ifdef __cplusplus +struct aesopenssl16x8_key_t{ + AES_KEY k; + aesopenssl16x8_key_t(){ + aesopenssl16x8_ukey_t ukey={{}}; + AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k); + } + aesopenssl16x8_key_t(const aesopenssl16x8_ukey_t& ukey){ + AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k); + } + aesopenssl16x8_key_t& operator=(const aesopenssl16x8_ukey_t& ukey){ + AES_set_encrypt_key((const unsigned char *)&ukey.v[0], 128, &k); + return *this; + } + bool operator==(const aesopenssl16x8_key_t& rhs) const{ + return (k.rounds == rhs.k.rounds) && 0==::memcmp(&k.rd_key[0], &rhs.k.rd_key[0], (k.rounds+1) * 4 * sizeof(uint32_t)); + } + bool operator!=(const aesopenssl16x8_key_t& rhs) const{ + return !(*this == rhs); + } + friend std::ostream& operator<<(std::ostream& os, const aesopenssl16x8_key_t& v){ + os << v.k.rounds; + const unsigned int *p = &v.k.rd_key[0]; + for(int i=0; i<(v.k.rounds+1); ++i){ + os << " " << p[0] << " " << p[1] << " " << p[2] << " " << p[3]; + p += 4; + } + return os; + } + friend std::istream& operator>>(std::istream& is, aesopenssl16x8_key_t& v){ + is >> v.k.rounds; + unsigned int *p = &v.k.rd_key[0]; + for(int i=0; i<(v.k.rounds+1); ++i){ + is >> p[0] >> p[1] >> p[2] >> p[3]; + p += 4; + } + return is; + } +}; +#else +typedef struct aesopenssl16x8_key_t{ + AES_KEY k; +}aesopenssl16x8_key_t; +RANDOM_ITERATOR_R123_STATIC_INLINE struct aesopenssl16x8_key_t aesopenssl16x8keyinit(aesopenssl16x8_ukey_t uk){ + aesopenssl16x8_key_t ret; + AES_set_encrypt_key((const unsigned char *)&uk.v[0], 128, &ret.k); + return ret; +} +#endif + +RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key)); +RANDOM_ITERATOR_R123_STATIC_INLINE +aesopenssl16x8_ctr_t aesopenssl16x8_R(aesopenssl16x8_ctr_t ctr, aesopenssl16x8_key_t key){ + aesopenssl16x8_ctr_t ret; + AES_encrypt((const unsigned char*)&ctr.v[0], (unsigned char *)&ret.v[0], &key.k); + return ret; +} + +#define aesopenssl16x8_rounds aesni4x32_rounds +#define aesopenssl16x8(c,k) aesopenssl16x8_R(aesopenssl16x8_rounds) + +#ifdef __cplusplus +namespace random_iterator_r123{ +struct AESOpenSSL16x8{ + typedef aesopenssl16x8_ctr_t ctr_type; + typedef aesopenssl16x8_key_t key_type; + typedef aesopenssl16x8_ukey_t ukey_type; + static const unsigned int rounds=10; + ctr_type operator()(const ctr_type& in, const key_type& k){ + ctr_type out; + AES_encrypt((const unsigned char *)&in[0], (unsigned char *)&out[0], &k.k); + return out; + } +}; +} // namespace random_iterator_r123 +#endif /* __cplusplus */ +#endif /* RANDOM_ITERATOR_R123_USE_AES_OPENSSL */ + +#endif diff --git a/random_iterator/detail/Random123/array.h b/random_iterator/detail/Random123/array.h new file mode 100644 index 0000000..b6ca0ec --- /dev/null +++ b/random_iterator/detail/Random123/array.h @@ -0,0 +1,348 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _r123array_dot_h__ +#define _r123array_dot_h__ +#include "features/compilerfeatures.h" +#include "features/sse.h" + +#if !defined(__cplusplus) || defined(__METAL_MACOS__) +#define CXXMETHODS(_N, W, T) +#define CXXOVERLOADS(_N, W, T) +#define CXXMETHODS_REQUIRING_STL +#else + +#include <stddef.h> +#include <algorithm> +#include <stdexcept> +#include <iterator> +#include <limits> +#include <iostream> + +/** @defgroup arrayNxW The r123arrayNxW classes + + Each of the r123arrayNxW is a fixed size array of N W-bit unsigned integers. + It is functionally equivalent to the C++11 std::array<N, uintW_t>, + but does not require C++11 features or libraries. + + In addition to meeting most of the requirements of a Container, + it also has a member function, incr(), which increments the zero-th + element and carrys overflows into higher indexed elements. Thus, + by using incr(), sequences of up to 2^(N*W) distinct values + can be produced. + + If SSE is supported by the compiler, then the class + r123array1xm128i is also defined, in which the data member is an + array of one r123m128i object. + + When compiling with __CUDA_ARCH__ defined, the reverse iterator + methods (rbegin, rend, crbegin, crend) are not defined because + CUDA does not support std::reverse_iterator. + +*/ + +/** @cond HIDDEN_FROM_DOXYGEN */ + +template <typename value_type> +inline RANDOM_ITERATOR_R123_CUDA_DEVICE value_type assemble_from_u32(uint32_t *p32){ + value_type v=0; + for(size_t i=0; i<(3+sizeof(value_type))/4; ++i) + v |= ((value_type)(*p32++)) << (32*i); + return v; +} + +/** @endcond */ + +#ifdef __CUDA_ARCH__ +/* CUDA can't handle std::reverse_iterator. We *could* implement it + ourselves, but let's not bother until somebody really feels a need + to reverse-iterate through an r123array */ +#define CXXMETHODS_REQUIRING_STL +#else +#define CXXMETHODS_REQUIRING_STL \ + public: \ + typedef std::reverse_iterator<iterator> reverse_iterator; \ + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reverse_iterator rbegin(){ return reverse_iterator(end()); } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reverse_iterator rend(){ return reverse_iterator(begin()); } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reverse_iterator crbegin() const{ return const_reverse_iterator(cend()); } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reverse_iterator crend() const{ return const_reverse_iterator(cbegin()); } +#endif + +// Work-alike methods and typedefs modeled on std::array: +#define CXXMETHODS(_N, W, T) \ + typedef T value_type; \ + typedef T* iterator; \ + typedef const T* const_iterator; \ + typedef value_type& reference; \ + typedef const value_type& const_reference; \ + typedef size_t size_type; \ + typedef ptrdiff_t difference_type; \ + typedef T* pointer; \ + typedef const T* const_pointer; \ + /* Boost.array has static_size. C++11 specializes tuple_size */ \ + enum {static_size = _N}; \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reference operator[](size_type i){return v[i];} \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reference operator[](size_type i) const {return v[i];} \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reference at(size_type i){ if(i >= _N) RANDOM_ITERATOR_R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reference at(size_type i) const { if(i >= _N) RANDOM_ITERATOR_R123_THROW(std::out_of_range("array index out of range")); return (*this)[i]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE size_type size() const { return _N; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE size_type max_size() const { return _N; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE bool empty() const { return _N==0; }; \ + RANDOM_ITERATOR_R123_CUDA_DEVICE iterator begin() { return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE iterator end() { return &v[_N]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_iterator begin() const { return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_iterator end() const { return &v[_N]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_iterator cbegin() const { return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_iterator cend() const { return &v[_N]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE pointer data(){ return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_pointer data() const{ return &v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reference front(){ return v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reference front() const{ return v[0]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE reference back(){ return v[_N-1]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE const_reference back() const{ return v[_N-1]; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE bool operator==(const r123array##_N##x##W& rhs) const{ \ + /* CUDA3 does not have std::equal */ \ + for (size_t i = 0; i < _N; ++i) \ + if (v[i] != rhs.v[i]) return false; \ + return true; \ + } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE bool operator!=(const r123array##_N##x##W& rhs) const{ return !(*this == rhs); } \ + /* CUDA3 does not have std::fill_n */ \ + RANDOM_ITERATOR_R123_CUDA_DEVICE void fill(const value_type& val){ for (size_t i = 0; i < _N; ++i) v[i] = val; } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE void swap(r123array##_N##x##W& rhs){ \ + /* CUDA3 does not have std::swap_ranges */ \ + for (size_t i = 0; i < _N; ++i) { \ + T tmp = v[i]; \ + v[i] = rhs.v[i]; \ + rhs.v[i] = tmp; \ + } \ + } \ + RANDOM_ITERATOR_R123_CUDA_DEVICE r123array##_N##x##W& incr(RANDOM_ITERATOR_R123_ULONG_LONG n=1){ \ + /* This test is tricky because we're trying to avoid spurious \ + complaints about illegal shifts, yet still be compile-time \ + evaulated. */ \ + if(sizeof(T)<sizeof(n) && n>>((sizeof(T)<sizeof(n))?8*sizeof(T):0) ) \ + return incr_carefully(n); \ + if(n==1){ \ + ++v[0]; \ + if(_N==1 || RANDOM_ITERATOR_R123_BUILTIN_EXPECT(!!v[0], 1)) return *this; \ + }else{ \ + v[0] += n; \ + if(_N==1 || RANDOM_ITERATOR_R123_BUILTIN_EXPECT(n<=v[0], 1)) return *this; \ + } \ + /* We expect that the N==?? tests will be \ + constant-folded/optimized away by the compiler, so only the \ + overflow tests (!!v[i]) remain to be done at runtime. For \ + small values of N, it would be better to do this as an \ + uncondtional sequence of adc. An experiment/optimization \ + for another day... \ + N.B. The weird subscripting: v[_N>3?3:0] is to silence \ + a spurious error from icpc \ + */ \ + ++v[_N>1?1:0]; \ + if(_N==2 || RANDOM_ITERATOR_R123_BUILTIN_EXPECT(!!v[_N>1?1:0], 1)) return *this; \ + ++v[_N>2?2:0]; \ + if(_N==3 || RANDOM_ITERATOR_R123_BUILTIN_EXPECT(!!v[_N>2?2:0], 1)) return *this; \ + ++v[_N>3?3:0]; \ + for(size_t i=4; i<_N; ++i){ \ + if( RANDOM_ITERATOR_R123_BUILTIN_EXPECT(!!v[i-1], 1) ) return *this; \ + ++v[i]; \ + } \ + return *this; \ + } \ + /* seed(SeedSeq) would be a constructor if having a constructor */ \ + /* didn't cause headaches with defaults */ \ + template <typename SeedSeq> \ + RANDOM_ITERATOR_R123_CUDA_DEVICE static r123array##_N##x##W seed(SeedSeq &ss){ \ + r123array##_N##x##W ret; \ + const size_t Ngen = _N*((3+sizeof(value_type))/4); \ + uint32_t u32[Ngen]; \ + uint32_t *p32 = &u32[0]; \ + ss.generate(&u32[0], &u32[Ngen]); \ + for(size_t i=0; i<_N; ++i){ \ + ret.v[i] = assemble_from_u32<value_type>(p32); \ + p32 += (3+sizeof(value_type))/4; \ + } \ + return ret; \ + } \ +protected: \ + RANDOM_ITERATOR_R123_CUDA_DEVICE r123array##_N##x##W& incr_carefully(RANDOM_ITERATOR_R123_ULONG_LONG n){ \ + /* n may be greater than the maximum value of a single value_type */ \ + value_type vtn; \ + vtn = n; \ + v[0] += n; \ + const unsigned rshift = 8* ((sizeof(n)>sizeof(value_type))? sizeof(value_type) : 0); \ + for(size_t i=1; i<_N; ++i){ \ + if(rshift){ \ + n >>= rshift; \ + }else{ \ + n=0; \ + } \ + if( v[i-1] < vtn ) \ + ++n; \ + if( n==0 ) break; \ + vtn = n; \ + v[i] += n; \ + } \ + return *this; \ + } \ + +/** @cond HIDDEN_FROM_DOXYGEN */ + +// There are several tricky considerations for the insertion and extraction +// operators: +// - we would like to be able to print r123array16x8 as a sequence of 16 integers, +// not as 16 bytes. +// - we would like to be able to print r123array1xm128i. +// - we do not want an int conversion operator in r123m128i because it causes +// lots of ambiguity problems with automatic promotions. +// Solution: r123arrayinsertable and r123arrayextractable + +template<typename T> +struct r123arrayinsertable{ + const T& v; + r123arrayinsertable(const T& t_) : v(t_) {} + friend std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<T>& t){ + return os << t.v; + } +}; + +template<> +struct r123arrayinsertable<uint8_t>{ + const uint8_t& v; + r123arrayinsertable(const uint8_t& t_) : v(t_) {} + friend std::ostream& operator<<(std::ostream& os, const r123arrayinsertable<uint8_t>& t){ + return os << (int)t.v; + } +}; + +template<typename T> +struct r123arrayextractable{ + T& v; + r123arrayextractable(T& t_) : v(t_) {} + friend std::istream& operator>>(std::istream& is, r123arrayextractable<T>& t){ + return is >> t.v; + } +}; + +template<> +struct r123arrayextractable<uint8_t>{ + uint8_t& v; + r123arrayextractable(uint8_t& t_) : v(t_) {} + friend std::istream& operator>>(std::istream& is, r123arrayextractable<uint8_t>& t){ + int i; + is >> i; + t.v = i; + return is; + } +}; +/** @endcond */ + +#define CXXOVERLOADS(_N, W, T) \ + \ +inline std::ostream& operator<<(std::ostream& os, const r123array##_N##x##W& a){ \ + os << r123arrayinsertable<T>(a.v[0]); \ + for(size_t i=1; i<_N; ++i) \ + os << " " << r123arrayinsertable<T>(a.v[i]); \ + return os; \ +} \ + \ +inline std::istream& operator>>(std::istream& is, r123array##_N##x##W& a){ \ + for(size_t i=0; i<_N; ++i){ \ + r123arrayextractable<T> x(a.v[i]); \ + is >> x; \ + } \ + return is; \ +} \ + \ +namespace random_iterator_r123{ \ + typedef r123array##_N##x##W Array##_N##x##W; \ +} + +#endif /* __cplusplus */ + +/* _r123array_tpl expands to a declaration of struct r123arrayNxW. + + In C, it's nothing more than a struct containing an array of N + objects of type T. + + In C++ it's the same, but endowed with an assortment of member + functions, typedefs and friends. In C++, r123arrayNxW looks a lot + like std::array<T,N>, has most of the capabilities of a container, + and satisfies the requirements outlined in compat/Engine.hpp for + counter and key types. ArrayNxW, in the r123 namespace is + a typedef equivalent to r123arrayNxW. +*/ + +#define _r123array_tpl(_N, W, T) \ + /** @ingroup arrayNxW */ \ + /** @see arrayNxW */ \ +struct r123array##_N##x##W{ \ + T v[_N]; \ + CXXMETHODS(_N, W, T) \ + CXXMETHODS_REQUIRING_STL \ +}; \ + \ +CXXOVERLOADS(_N, W, T) + + +_r123array_tpl(1, 32, uint32_t) /* r123array1x32 */ +_r123array_tpl(2, 32, uint32_t) /* r123array2x32 */ +_r123array_tpl(4, 32, uint32_t) /* r123array4x32 */ +_r123array_tpl(8, 32, uint32_t) /* r123array8x32 */ + +#if RANDOM_ITERATOR_R123_USE_64BIT +_r123array_tpl(1, 64, uint64_t) /* r123array1x64 */ +_r123array_tpl(2, 64, uint64_t) /* r123array2x64 */ +_r123array_tpl(4, 64, uint64_t) /* r123array4x64 */ +#endif + +_r123array_tpl(16, 8, uint8_t) /* r123array16x8 for ARSsw, AESsw */ + +#if RANDOM_ITERATOR_R123_USE_SSE +_r123array_tpl(1, m128i, r123m128i) /* r123array1x128i for ARSni, AESni */ +#endif + +/* In C++, it's natural to use sizeof(a::value_type), but in C it's + pretty convoluted to figure out the width of the value_type of an + r123arrayNxW: +*/ +#define RANDOM_ITERATOR_R123_W(a) (8*sizeof(((a *)0)->v[0])) + +/** @namespace random_iterator_r123 + Most of the Random123 C++ API is contained in the r123 namespace. +*/ + +#endif + diff --git a/random_iterator/detail/Random123/ars.h b/random_iterator/detail/Random123/ars.h new file mode 100644 index 0000000..17d503a --- /dev/null +++ b/random_iterator/detail/Random123/ars.h @@ -0,0 +1,204 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __Random123_ars_dot_hpp__ +#define __Random123_ars_dot_hpp__ + +#include "features/compilerfeatures.h" +#include "array.h" + +#if RANDOM_ITERATOR_R123_USE_AES_NI + +#ifndef ARS1xm128i_DEFAULT_ROUNDS +#define ARS1xm128i_DEFAULT_ROUNDS 7 +#endif + +/** @ingroup AESNI */ +enum r123_enum_ars1xm128i {ars1xm128i_rounds = ARS1xm128i_DEFAULT_ROUNDS}; + +/* ARS1xm128i with Weyl keys. Fast, and Crush-resistant, but NOT CRYPTO. */ +/** @ingroup AESNI */ +typedef struct r123array1xm128i ars1xm128i_ctr_t; +/** @ingroup AESNI */ +typedef struct r123array1xm128i ars1xm128i_key_t; +/** @ingroup AESNI */ +typedef struct r123array1xm128i ars1xm128i_ukey_t; +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE ars1xm128i_key_t ars1xm128ikeyinit(ars1xm128i_ukey_t uk) { return uk; } +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE ars1xm128i_ctr_t ars1xm128i_R(unsigned int Nrounds, ars1xm128i_ctr_t in, ars1xm128i_key_t k){ + __m128i kweyl = _mm_set_epi64x(RANDOM_ITERATOR_R123_64BIT(0xBB67AE8584CAA73B), /* sqrt(3) - 1.0 */ + RANDOM_ITERATOR_R123_64BIT(0x9E3779B97F4A7C15)); /* golden ratio */ + /* N.B. the aesenc instructions do the xor *after* + // so if we want to follow the AES pattern, we + // have to do the initial xor explicitly */ + __m128i kk = k.v[0].m; + __m128i v = _mm_xor_si128(in.v[0].m, kk); + ars1xm128i_ctr_t ret; + RANDOM_ITERATOR_R123_ASSERT(Nrounds<=10); + if( Nrounds>1 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>2 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>3 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>4 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>5 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>6 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>7 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>8 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + if( Nrounds>9 ){ + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenc_si128(v, kk); + } + kk = _mm_add_epi64(kk, kweyl); + v = _mm_aesenclast_si128(v, kk); + ret.v[0].m = v; + return ret; +} + +/** @def ars1xm128i +@ingroup AESNI +The ars1mx128i macro provides a C API interface to the @ref AESNI "ARS" CBRNG with the default number of rounds i.e. \c ars1xm128i_rounds **/ +#define ars1xm128i(c,k) ars1xm128i_R(ars1xm128i_rounds, c, k) + +/** @ingroup AESNI */ +typedef struct r123array4x32 ars4x32_ctr_t; +/** @ingroup AESNI */ +typedef struct r123array4x32 ars4x32_key_t; +/** @ingroup AESNI */ +typedef struct r123array4x32 ars4x32_ukey_t; +/** @ingroup AESNI */ +enum r123_enum_ars4x32 {ars4x32_rounds = ARS1xm128i_DEFAULT_ROUNDS}; +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE ars4x32_key_t ars4x32keyinit(ars4x32_ukey_t uk) { return uk; } +/** @ingroup AESNI */ +RANDOM_ITERATOR_R123_STATIC_INLINE ars4x32_ctr_t ars4x32_R(unsigned int Nrounds, ars4x32_ctr_t c, ars4x32_key_t k){ + ars1xm128i_ctr_t c128; + ars1xm128i_key_t k128; + c128.v[0].m = _mm_set_epi32(c.v[3], c.v[2], c.v[1], c.v[0]); + k128.v[0].m = _mm_set_epi32(k.v[3], k.v[2], k.v[1], k.v[0]); + c128 = ars1xm128i_R(Nrounds, c128, k128); + _mm_storeu_si128((__m128i*)&c.v[0], c128.v[0].m); + return c; +} + +/** @def ars4x32 +@ingroup AESNI +The ars4x32 macro provides a C API interface to the @ref AESNI "ARS" CBRNG with the default number of rounds i.e. \c ars4x32_rounds **/ +#define ars4x32(c,k) ars4x32_R(ars4x32_rounds, c, k) + +#ifdef __cplusplus +namespace random_iterator_r123{ +/** +@ingroup AESNI + +ARS1xm128i_R exports the member functions, typedefs and operator overloads required by a @ref CBRNG class. + +ARS1xm128i uses the crypotgraphic AES round function, but a @b non-cryptographc key schedule +to save time and space. + +ARS1xm128i is only available when the feature-test macro RANDOM_ITERATOR_R123_USE_AES_NI is true, which +should occur only when the compiler is configured to generate AES-NI instructions (or +when defaults are overridden by compile-time, compiler-command-line options). + +The template argument, ROUNDS, is the number of times the ARS round +functions will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=5 or more. + +@class ARS1xm128i_R + +*/ +template<unsigned int ROUNDS> +struct ARS1xm128i_R{ + typedef ars1xm128i_ctr_t ctr_type; + typedef ars1xm128i_key_t key_type; + typedef ars1xm128i_key_t ukey_type; + static const unsigned int rounds=ROUNDS; + RANDOM_ITERATOR_R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ + return ars1xm128i_R(ROUNDS, ctr, key); + } +}; + +/** @class ARS4x32_R + @ingroup AESNI +*/ + +template<unsigned int ROUNDS> +struct ARS4x32_R{ + typedef ars4x32_ctr_t ctr_type; + typedef ars4x32_key_t key_type; + typedef ars4x32_key_t ukey_type; + static const unsigned int rounds=ROUNDS; + RANDOM_ITERATOR_R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ + return ars4x32_R(ROUNDS, ctr, key); + } +}; +/** +@ingroup AESNI + +@class ARS1xm128i_R + ARS1xm128i is equivalent to ARS1xm128i_R<7>. With 7 rounds, + the ARS1xm128i CBRNG has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. */ +typedef ARS1xm128i_R<ars1xm128i_rounds> ARS1xm128i; +typedef ARS4x32_R<ars4x32_rounds> ARS4x32; +} // namespace random_iterator_r123 + +#endif /* __cplusplus */ + +#endif /* RANDOM_ITERATOR_R123_USE_AES_NI */ + +#endif diff --git a/random_iterator/detail/Random123/boxmuller.hpp b/random_iterator/detail/Random123/boxmuller.hpp new file mode 100644 index 0000000..0c282cb --- /dev/null +++ b/random_iterator/detail/Random123/boxmuller.hpp @@ -0,0 +1,139 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +// This file implements the Box-Muller method for generating gaussian +// random variables (GRVs). Box-Muller has the advantage of +// deterministically requiring exactly two uniform random variables as +// input and producing exactly two GRVs as output, which makes it +// especially well-suited to the counter-based generators in +// Random123. Other methods (e.g., Ziggurat, polar) require an +// indeterminate number of inputs for each output and so require a +// 'MicroURNG' to be used with Random123. The down side of Box-Muller +// is that it calls sincos, log and sqrt, which may be slow. However, +// on GPUs, these functions are remarkably fast, which makes +// Box-Muller the fastest GRV generator we know of on GPUs. +// +// This file exports two structs and one overloaded function, +// all in the r123 namespace: +// struct r123::float2{ float x,y; } +// struct r123::double2{ double x,y; } +// +// r123::float2 r123::boxmuller(uint32_t u0, uint32_t u1); +// r123::double2 r123::boxmuller(uint64_t u0, uint64_t u1); +// +// float2 and double2 are identical to their synonymous global- +// namespace structures in CUDA. +// +// This file may not be as portable, and has not been tested as +// rigorously as other files in the library, e.g., the generators. +// Nevertheless, we hope it is useful and we encourage developers to +// copy it and modify it for their own use. We invite comments and +// improvements. + +#ifndef _r123_BOXMULLER_HPP__ +#define _r123_BOXMULLER_HPP__ + +#include <Random123/features/compilerfeatures.h> +#include <Random123/uniform.hpp> +#include <math.h> + +namespace random_iterator_r123{ + +#if !defined(__CUDACC__) +typedef struct { float x, y; } float2; +typedef struct { double x, y; } double2; +#else +typedef ::float2 float2; +typedef ::double2 double2; +#endif + +#if !defined(RANDOM_ITERATOR_R123_NO_SINCOS) && defined(__APPLE__) +/* MacOS X 10.10.5 (2015) doesn't have sincosf */ +#define RANDOM_ITERATOR_R123_NO_SINCOS 1 +#endif + +#if RANDOM_ITERATOR_R123_NO_SINCOS /* enable this if sincos and sincosf are not in the math library */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE void sincosf(float x, float *s, float *c) { + *s = sinf(x); + *c = cosf(x); +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE void sincos(double x, double *s, double *c) { + *s = sin(x); + *c = cos(x); +} +#endif /* sincos is not in the math library */ + +#if !defined(CUDART_VERSION) || CUDART_VERSION < 5000 /* enabled if sincospi and sincospif are not in math lib */ + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE void sincospif(float x, float *s, float *c){ + const float PIf = 3.1415926535897932f; + sincosf(PIf*x, s, c); +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE void sincospi(double x, double *s, double *c) { + const double PI = 3.1415926535897932; + sincos(PI*x, s, c); +} +#endif /* sincospi is not in math lib */ + +/* + * take two 32bit unsigned random values and return a float2 with + * two random floats in a normal distribution via a Box-Muller transform + */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE float2 boxmuller(uint32_t u0, uint32_t u1) { + float r; + float2 f; + sincospif(uneg11<float>(u0), &f.x, &f.y); + r = sqrtf(-2.f * logf(u01<float>(u1))); // u01 is guaranteed to avoid 0. + f.x *= r; + f.y *= r; + return f; +} + +/* + * take two 64bit unsigned random values and return a double2 with + * two random doubles in a normal distribution via a Box-Muller transform + */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double2 boxmuller(uint64_t u0, uint64_t u1) { + double r; + double2 f; + + sincospi(uneg11<double>(u0), &f.x, &f.y); + r = sqrt(-2. * log(u01<double>(u1))); // u01 is guaranteed to avoid 0. + f.x *= r; + f.y *= r; + return f; +} +} // namespace random_iterator_r123 + +#endif /* BOXMULLER_H__ */ diff --git a/random_iterator/detail/Random123/conventional/Engine.hpp b/random_iterator/detail/Random123/conventional/Engine.hpp new file mode 100644 index 0000000..867d765 --- /dev/null +++ b/random_iterator/detail/Random123/conventional/Engine.hpp @@ -0,0 +1,276 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __Engine_dot_hpp_ +#define __Engine_dot_hpp_ + +#include "../features/compilerfeatures.h" +#include "../array.h" +#include <limits> +#include <stdexcept> +#include <sstream> +#include <algorithm> +#include <vector> +#if RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#include <type_traits> +#endif + +namespace random_iterator_r123{ +/** + If G satisfies the requirements of a CBRNG, and has a ctr_type whose + value_type is an unsigned integral type, then Engine<G> satisfies + the requirements of a C++11 "Uniform Random Number Engine" and can + be used in any context where such an object is expected. + + Note that wrapping a counter based RNG with a traditional API in + this way obscures much of the power of counter based PRNGs. + Nevertheless, it may be of value in applications that are already + coded to work with the C++11 random number engines. + + The MicroURNG template in MicroURNG.hpp + provides the more limited functionality of a C++11 "Uniform + Random Number Generator", but leaves the application in control + of counters and keys and hence may be preferable to the Engine template. + For example, a MicroURNG allows one to use C++11 "Random Number + Distributions" without giving up control over the counters + and keys. +*/ + +template<typename CBRNG> +struct Engine { + typedef CBRNG cbrng_type; + typedef typename CBRNG::ctr_type ctr_type; + typedef typename CBRNG::key_type key_type; + typedef typename CBRNG::ukey_type ukey_type; + typedef typename ctr_type::value_type result_type; + +protected: + cbrng_type b; + key_type key; + ctr_type c; + ctr_type v; + + void fix_invariant(){ + if( v.back() != 0 ) { + result_type vv = v.back(); + v = b(c, key); + v.back() = vv; + } + } +public: + explicit Engine() : b(), c() { + ukey_type x = {{}}; + v.back() = 0; + key = x; + } + explicit Engine(result_type r) : b(), c() { + ukey_type x = {{typename ukey_type::value_type(r)}}; + v.back() = 0; + key = x; + } + // 26.5.3 says that the SeedSeq templates shouldn't particpate in + // overload resolution unless the type qualifies as a SeedSeq. + // How that is determined is unspecified, except that "as a + // minimum a type shall not qualify as a SeedSeq if it is + // implicitly convertible to a result_type." + // + // First, we make sure that even the non-const copy constructor + // works as expected. In addition, if we've got C++11 + // type_traits, we use enable_if and is_convertible to implement + // the convertible-to-result_type restriction. Otherwise, the + // template is unconditional and will match in some surpirsing + // and undesirable situations. + Engine(Engine& e) : b(e.b), key(e.key), c(e.c){ + v.back() = e.v.back(); + fix_invariant(); + } + Engine(const Engine& e) : b(e.b), key(e.key), c(e.c){ + v.back() = e.v.back(); + fix_invariant(); + } + + template <typename SeedSeq> + explicit Engine(SeedSeq &s +#if RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS + , typename std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0 +#endif + ) + : b(), c() { + ukey_type ukey = ukey_type::seed(s); + key = ukey; + v.back() = 0; + } + void seed(result_type r){ + *this = Engine(r); + } + template <typename SeedSeq> + void seed(SeedSeq &s +#if RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS + , typename std::enable_if<!std::is_convertible<SeedSeq, result_type>::value>::type* =0 +#endif + ){ + *this = Engine(s); + } + void seed(){ + *this = Engine(); + } + friend bool operator==(const Engine& lhs, const Engine& rhs){ + return lhs.c==rhs.c && lhs.v.back() == rhs.v.back() && lhs.key == rhs.key; + } + friend bool operator!=(const Engine& lhs, const Engine& rhs){ + return lhs.c!=rhs.c || lhs.v.back()!=rhs.v.back() || lhs.key!=rhs.key; + } + + friend std::ostream& operator<<(std::ostream& os, const Engine& be){ + return os << be.c << " " << be.key << " " << be.v.back(); + } + + friend std::istream& operator>>(std::istream& is, Engine& be){ + is >> be.c >> be.key >> be.v.back(); + be.fix_invariant(); + return is; + } + + // The <random> shipped with MacOS Xcode 4.5.2 imposes a + // non-standard requirement that URNGs also have static data + // members: _Min and _Max. Later versions of libc++ impose the + // requirement only when constexpr isn't supported. Although the + // Xcode 4.5.2 requirement is clearly non-standard, it is unlikely + // to be fixed and it is very easy work around. We certainly + // don't want to go to great lengths to accommodate every buggy + // library we come across, but in this particular case, the effort + // is low and the benefit is high, so it's worth doing. Thanks to + // Yan Zhou for pointing this out to us. See similar code in + // ../MicroURNG.hpp + const static result_type _Min = 0; + const static result_type _Max = ~((result_type)0); + + static RANDOM_ITERATOR_R123_CONSTEXPR result_type min RANDOM_ITERATOR_R123_NO_MACRO_SUBST () { return _Min; } + static RANDOM_ITERATOR_R123_CONSTEXPR result_type max RANDOM_ITERATOR_R123_NO_MACRO_SUBST () { return _Max; } + + result_type operator()(){ + if( c.size() == 1 ) // short-circuit the scalar case. Compilers aren't mind-readers. + return b(c.incr(), key)[0]; + result_type& elem = v.back(); + if( elem == 0 ){ + v = b(c.incr(), key); + result_type ret = v.back(); + elem = c.size()-1; + return ret; + } + return v[--elem]; + } + + void discard(RANDOM_ITERATOR_R123_ULONG_LONG skip){ + // don't forget: elem counts down + size_t nelem = c.size(); + size_t sub = skip % nelem; + result_type& elem = v.back(); + skip /= nelem; + if (elem < sub) { + elem += nelem; + skip++; + } + elem -= sub; + c.incr(skip); + fix_invariant(); + } + + //-------------------------- + // Some bonus methods, not required for a Random Number + // Engine + + // Constructors and seed() method for ukey_type seem useful + // We need const and non-const to supersede the SeedSeq template. + explicit Engine(const ukey_type &uk) : key(uk), c(){ v.back() = 0; } + explicit Engine(ukey_type &uk) : key(uk), c(){ v.back() = 0; } + void seed(const ukey_type& uk){ + *this = Engine(uk); + } + void seed(ukey_type& uk){ + *this = Engine(uk); + } + +#if RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS + template <typename DUMMY=void> + explicit Engine(const key_type& k, + typename std::enable_if<!std::is_same<ukey_type, key_type>::value, DUMMY>::type* = 0) + : key(k), c(){ v.back() = 0; } + + template <typename DUMMY=void> + void seed(const key_type& k, + typename std::enable_if<!std::is_same<ukey_type, key_type>::value, DUMMY>::type* = 0){ + *this = Engine(k); + } +#endif + + // Forward the e(counter) to the CBRNG we are templated + // on, using the current value of the key. + ctr_type operator()(const ctr_type& c) const{ + return b(c, key); + } + + key_type getkey() const{ + return key; + } + + // N.B. setkey(k) is different from seed(k) because seed(k) zeros + // the counter (per the C++11 requirements for an Engine), whereas + // setkey does not. + void setkey(const key_type& k){ + key = k; + fix_invariant(); + } + + // Maybe the caller want's to know the details of + // the internal state, e.g., so it can call a different + // bijection with the same counter. + std::pair<ctr_type, result_type> getcounter() const { + return std::make_pair(c, v.back()); + } + + // And the inverse. + void setcounter(const ctr_type& _c, result_type _elem){ + static const size_t nelem = c.size(); + if( _elem >= nelem ) + throw std::range_error("Engine::setcounter called with elem out of range"); + c = _c; + v.back() = _elem; + fix_invariant(); + } + + void setcounter(const std::pair<ctr_type, result_type>& ce){ + setcounter(ce.first, ce.second); + } +}; +} // namespace random_iterator_r123 + +#endif diff --git a/random_iterator/detail/Random123/conventional/gsl_cbrng.h b/random_iterator/detail/Random123/conventional/gsl_cbrng.h new file mode 100644 index 0000000..44457d0 --- /dev/null +++ b/random_iterator/detail/Random123/conventional/gsl_cbrng.h @@ -0,0 +1,128 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __r123_compat_gslrng_dot_h__ +#define __r123_compat_gslrng_dot_h__ + +#include <gsl/gsl_rng.h> +#include <string.h> + +/** + The macro: GSL_CBRNG(NAME, CBRNGNAME) + declares the necessary structs and constants that define a + gsl_rng_NAME type based on the counter-based RNG CBRNGNAME. For example: + + Usage: + + @code + #include <Random123/threefry.h> + #include <Random123/conventional/gsl_cbrng.h> // this file + GSL_CBRNG(cbrng, threefry4x32); // creates gsl_rng_cbrng + + int main(int argc, char **argv){ + gsl_rng *r = gsl_rng_alloc(gsl_rng_cbrng); + ... use r as you would use any other gsl_rng ... + } + @endcode + + It requires that NAME be the name of a CBRNG that follows the + naming and stylistic conventions of the Random123 library. + + Note that wrapping a \ref CBRNG "counter-based PRNG" with a traditional API in + this way obscures much of the power of the CBRNG API. + Nevertheless, it may be of value to applications that are already + coded to work with GSL random number generators, and that wish + to use the RNGs in the Random123 library. + + */ + +#define GSL_CBRNG(NAME, CBRNGNAME) \ +const gsl_rng_type *gsl_rng_##NAME; \ + \ +typedef struct{ \ + CBRNGNAME##_ctr_t ctr; \ + CBRNGNAME##_ctr_t r; \ + CBRNGNAME##_key_t key; \ + int elem; \ +} NAME##_state; \ + \ +static unsigned long int NAME##_get(void *vstate){ \ + NAME##_state *st = (NAME##_state *)vstate; \ + const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]); \ + if( st->elem == 0 ){ \ + ++st->ctr.v[0]; \ + if( N>1 && st->ctr.v[0] == 0 ) ++st->ctr.v[1]; \ + if( N>2 && st->ctr.v[1] == 0 ) ++st->ctr.v[2]; \ + if( N>3 && st->ctr.v[2] == 0 ) ++st->ctr.v[3]; \ + st->r = CBRNGNAME(st->ctr, st->key); \ + st->elem = N; \ + } \ + return 0xffffffffUL & st->r.v[--st->elem]; \ +} \ + \ +static double \ +NAME##_get_double (void * vstate) \ +{ \ + return NAME##_get (vstate)/4294967296.0; \ +} \ + \ +static void NAME##_set(void *vstate, unsigned long int s){ \ + NAME##_state *st = (NAME##_state *)vstate; \ + st->elem = 0; \ + /* Assume that key and ctr have an array member, v, \ + as if they are r123arrayNxW. If not, this will fail \ + to compile. In particular, this macro fails to compile \ + when the underlying CBRNG requires use of keyinit */ \ + memset(&st->ctr.v[0], 0, sizeof(st->ctr.v)); \ + memset(&st->key.v[0], 0, sizeof(st->key.v)); \ + /* GSL 1.15 documentation says this about gsl_rng_set: \ + Note that the most generators only accept 32-bit seeds, with higher \ + values being reduced modulo 2^32. For generators with smaller \ + ranges the maximum seed value will typically be lower. \ + so we won't jump through any hoops here to deal with \ + high bits if sizeof(unsigned long) > sizeof(uint32_t). */ \ + st->key.v[0] = s; \ +} \ + \ +static const gsl_rng_type NAME##_type = { \ + #NAME, \ + 0xffffffffUL, \ + 0, \ + sizeof(NAME##_state), \ + &NAME##_set, \ + &NAME##_get, \ + &NAME##_get_double \ +}; \ + \ +const gsl_rng_type *gsl_rng_##NAME = &NAME##_type + +#endif + diff --git a/random_iterator/detail/Random123/features/clangfeatures.h b/random_iterator/detail/Random123/features/clangfeatures.h new file mode 100644 index 0000000..6fe7a57 --- /dev/null +++ b/random_iterator/detail/Random123/features/clangfeatures.h @@ -0,0 +1,93 @@ +/* +Copyright 2010-2016, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __clangfeatures_dot_hpp +#define __clangfeatures_dot_hpp + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#if (defined(__x86_64__)||defined(__i386__)) +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 1 +#else +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS __has_feature(cxx_unrestricted_unions) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT +#define RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT __has_feature(cxx_static_assert) +#endif + +// With clang-3.6, -Wall warns about unused-local-typedefs. +// The "obvious" thing to do is to ignore -Wunused-local-typedefs, +// but that doesn't work because earlier versions of clang blow +// up on an 'unknown warning group'. So we briefly ignore -Wall... +// It's tempting to just give up on static assertions in pre-c++11 code. +#if !RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT && !defined(RANDOM_ITERATOR_R123_STATIC_ASSERT) +#define RANDOM_ITERATOR_R123_STATIC_ASSERT(expr, msg) \ +_Pragma("clang diagnostic push") \ +_Pragma("clang diagnostic ignored \"-Wall\"") \ +typedef char static_assertion[(!!(expr))*2-1] \ +_Pragma("clang diagnostic pop") +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR +#define RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR __has_feature(cxx_constexpr) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS __has_feature(cxx_explicit_conversions) +#endif + +// With clang-3.0, the apparently simpler: +// #define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM __has_include(<random>) +// dumps core. +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_RANDOM +#if __cplusplus>=201103L && __has_include(<random>) +#define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM 1 +#else +#define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#if __cplusplus>=201103L && __has_include(<type_traits>) +#define RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS 1 +#else +#define RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS 0 +#endif +#endif + +#include "gccfeatures.h" + +#endif diff --git a/random_iterator/detail/Random123/features/compilerfeatures.h b/random_iterator/detail/Random123/features/compilerfeatures.h new file mode 100644 index 0000000..0648742 --- /dev/null +++ b/random_iterator/detail/Random123/features/compilerfeatures.h @@ -0,0 +1,343 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/** + +@page porting Preprocessor symbols for porting Random123 to different platforms. + +The Random123 library is portable across C, C++, CUDA, OpenCL environments, +and multiple operating systems (Linux, Windows 7, Mac OS X, FreeBSD, Solaris). +This level of portability requires the abstraction of some features +and idioms that are either not standardized (e.g., asm statments), or for which +different vendors have their own standards (e.g., SSE intrinsics) or for +which vendors simply refuse to conform to well-established standards (e.g., <inttypes.h>). + +Random123/features/compilerfeatures.h +conditionally includes a compiler-or-OS-specific Random123/featires/XXXfeatures.h file which +defines appropriate values for the preprocessor symbols which can be used with +a specific compiler or OS. Those symbols will then +be used by other header files and source files in the Random123 +library (and may be used by applications) to control what actually +gets presented to the compiler. + +Most of the symbols are boolean valued. In general, they will +\b always be defined with value either 1 or 0, so do +\b NOT use \#ifdef. Use \#if RANDOM_ITERATOR_R123_USE_SOMETHING instead. + +Library users can override any value by defining the pp-symbol with a compiler option, +e.g., + + cc -DRANDOM_ITERATOR_R123_USE_MULHILO64_C99 + +will use a strictly c99 version of the full-width 64x64->128-bit multiplication +function, even if it would be disabled by default. + +All boolean-valued pre-processor symbols in Random123/features/compilerfeatures.h start with the prefix RANDOM_ITERATOR_R123_USE_ +@verbatim + AES_NI + AES_OPENSSL + SSE4_2 + SSE4_1 + SSE + + STD_RANDOM + + GNU_UINT128 + ASM_GNU + ASM_MSASM + + CPUID_MSVC + + CXX11_RANDOM + CXX11_TYPE_TRAITS + CXX11_STATIC_ASSERT + CXX11_CONSTEXPR + CXX11_UNRESTRICTED_UNIONS + CXX11_EXPLICIT_CONVERSIONS + CXX11_LONG_LONG + CXX11_STD_ARRAY + CXX11 + + X86INTRIN_H + IA32INTRIN_H + XMMINTRIN_H + EMMINTRIN_H + SMMINTRIN_H + WMMINTRIN_H + INTRIN_H + + MULHILO32_ASM + MULHILO64_ASM + MULHILO64_MSVC_INTRIN + MULHILO64_CUDA_INTRIN + MULHILO64_OPENCL_INTRIN + MULHILO64_C99 + + U01_DOUBLE + +@endverbatim +Most have obvious meanings. Some non-obvious ones: + +AES_NI and AES_OPENSSL are not mutually exclusive. You can have one, +both or neither. + +GNU_UINT128 says that it's safe to use __uint128_t, but it +does not require its use. In particular, it should be +used in mulhilo<uint64_t> only if MULHILO64_ASM is unset. + +If the XXXINTRIN_H macros are true, then one should +@code +#include <xxxintrin.h> +@endcode +to gain accesss to compiler intrinsics. + +The CXX11_SOME_FEATURE macros allow the code to use specific +features of the C++11 language and library. The catchall +In the absence of a specific CXX11_SOME_FEATURE, the feature +is controlled by the catch-all RANDOM_ITERATOR_R123_USE_CXX11 macro. + +U01_DOUBLE defaults on, and can be turned off (set to 0) +if one does not want the utility functions that convert to double +(i.e. u01_*_53()), e.g. on OpenCL without the cl_khr_fp64 extension. + +There are a number of invariants that are always true. Application code may +choose to rely on these: + +<ul> +<li>ASM_GNU and ASM_MASM are mutually exclusive +<li>The "higher" SSE values imply the lower ones. +</ul> + +There are also non-boolean valued symbols: + +<ul> +<li>RANDOM_ITERATOR_R123_STATIC_INLINE - + According to both C99 and GNU99, the 'static inline' declaration allows + the compiler to not emit code if the function is not used. + Note that the semantics of 'inline', 'static' and 'extern' in + gcc have changed over time and are subject to modification by + command line options, e.g., -std=gnu89, -fgnu-inline. + Nevertheless, it appears that the meaning of 'static inline' + has not changed over time and (with a little luck) the use of 'static inline' + here will be portable between versions of gcc and to other C99 + compilers. + See: http://gcc.gnu.org/onlinedocs/gcc/Inline.html + http://www.greenend.org.uk/rjk/2003/03/inline.html + +<li>RANDOM_ITERATOR_R123_FORCE_INLINE(decl) - + which expands to 'decl', adorned with the compiler-specific + embellishments to strongly encourage that the declared function be + inlined. If there is no such compiler-specific magic, it should + expand to decl, unadorned. + +<li>RANDOM_ITERATOR_R123_CUDA_DEVICE - which expands to __device__ (or something else with + sufficiently similar semantics) when CUDA is in use, and expands + to nothing in other cases. + +<li>RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE - which expands to 'thread' (or + something else with sufficiently similar semantics) when compiling a + Metal kernel, and expands to nothing in other cases. + +<li>RANDOM_ITERATOR_R123_ASSERT(x) - which expands to assert(x), or maybe to nothing at + all if we're in an environment so feature-poor that you can't even + call assert (I'm looking at you, CUDA and OpenCL), or even include + assert.h safely (OpenCL). + +<li>RANDOM_ITERATOR_R123_STATIC_ASSERT(expr,msg) - which expands to + static_assert(expr,msg), or to an expression that + will raise a compile-time exception if expr is not true. + +<li>RANDOM_ITERATOR_R123_ULONG_LONG - which expands to a declaration of the longest available + unsigned integer. + +<li>RANDOM_ITERATOR_R123_64BIT(x) - expands to something equivalent to + UINT64_C(x) from <stdint.h>, even in environments where <stdint.h> + is not available, e.g., MSVC and OpenCL. + +<li>RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely_value) - expands to something with + the semantics of gcc's __builtin_expect(expr,likely_value). If + the environment has nothing like __builtin_expect, it should expand + to just expr. +</ul> + + +\cond HIDDEN_FROM_DOXYGEN +*/ + +/* +N.B. When something is added to the list of features, it should be +added to each of the *features.h files, AND to examples/ut_features.cpp. +*/ + +/* N.B. most other compilers (icc, nvcc, open64, llvm) will also define __GNUC__, so order matters. */ +#if defined(__METAL_MACOS__) +#include "metalfeatures.h" +#elif defined(__OPENCL_VERSION__) && __OPENCL_VERSION__ > 0 +#include "openclfeatures.h" +#elif defined(__CUDACC__) +#include "nvccfeatures.h" +#elif defined(__ICC) +#include "iccfeatures.h" +#elif defined(__xlC__) +#include "xlcfeatures.h" +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +#include "sunprofeatures.h" +#elif defined(__OPEN64__) +#include "open64features.h" +#elif defined(__clang__) +#include "clangfeatures.h" +#elif defined(__GNUC__) +#include "gccfeatures.h" +#elif defined(__PGI) +#include "pgccfeatures.h" +#elif defined(_MSC_FULL_VER) +#include "msvcfeatures.h" +#else +#error "Can't identify compiler. You'll need to add a new xxfeatures.hpp" +{ /* maybe an unbalanced brace will terminate the compilation */ +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11 +#define RANDOM_ITERATOR_R123_USE_CXX11 (__cplusplus >= 201103L) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT +#define RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR +#define RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_RANDOM +#define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#define RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_LONG_LONG +#define RANDOM_ITERATOR_R123_USE_CXX11_LONG_LONG RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_STD_ARRAY +#define RANDOM_ITERATOR_R123_USE_CXX11_STD_ARRAY RANDOM_ITERATOR_R123_USE_CXX11 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_C99 +#define RANDOM_ITERATOR_R123_USE_MULHILO64_C99 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_STATIC_ASSERT +#if RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT +#define RANDOM_ITERATOR_R123_STATIC_ASSERT(expr, msg) static_assert(expr, msg) +#else + /* if msg always_looked_like_this, we could paste it into the name. Worth it? */ +#define RANDOM_ITERATOR_R123_STATIC_ASSERT(expr, msg) typedef char static_assertion[(!!(expr))*2-1] +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_CONSTEXPR +#if RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR +#define RANDOM_ITERATOR_R123_CONSTEXPR constexpr +#else +#define RANDOM_ITERATOR_R123_CONSTEXPR +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_64BIT +#define RANDOM_ITERATOR_R123_USE_64BIT 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_PHILOX_64BIT +#define RANDOM_ITERATOR_R123_USE_PHILOX_64BIT (RANDOM_ITERATOR_R123_USE_64BIT && (RANDOM_ITERATOR_R123_USE_MULHILO64_ASM || RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN || RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN || RANDOM_ITERATOR_R123_USE_GNU_UINT128 || RANDOM_ITERATOR_R123_USE_MULHILO64_C99 || RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN || RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN)) +#endif + +#ifndef RANDOM_ITERATOR_R123_ULONG_LONG +#if defined(__cplusplus) && !RANDOM_ITERATOR_R123_USE_CXX11_LONG_LONG +/* C++98 doesn't have long long. It doesn't have uint64_t either, but + we will have typedef'ed uint64_t to something in the xxxfeatures.h. + With luck, it won't elicit complaints from -pedantic. Cross your + fingers... */ +#define RANDOM_ITERATOR_R123_ULONG_LONG uint64_t +#else +#define RANDOM_ITERATOR_R123_ULONG_LONG unsigned long long +#endif +#endif + +/* UINT64_C should have been #defined by XXXfeatures.h, either by + #include <stdint.h> or through compiler-dependent hacks */ +#ifndef RANDOM_ITERATOR_R123_64BIT +#define RANDOM_ITERATOR_R123_64BIT(x) UINT64_C(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_THROW +#define RANDOM_ITERATOR_R123_THROW(x) throw (x) +#endif + +#ifndef RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE +#define RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE +#endif + +#ifndef RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE +#define RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE +#endif + +/* + * Windows.h (and perhaps other "well-meaning" code define min and + * max, so there's a high chance that our definition of min, max + * methods or use of std::numeric_limits min and max will cause + * complaints in any program that happened to include Windows.h or + * suchlike first. We use the null macro below in our own header + * files definition or use of min, max to defensively preclude + * this problem. It may not be enough; one might need to #define + * NOMINMAX before including Windows.h or compile with -DNOMINMAX. + */ +#define RANDOM_ITERATOR_R123_NO_MACRO_SUBST + +/** \endcond */ diff --git a/random_iterator/detail/Random123/features/gccfeatures.h b/random_iterator/detail/Random123/features/gccfeatures.h new file mode 100644 index 0000000..5fda36f --- /dev/null +++ b/random_iterator/detail/Random123/features/gccfeatures.h @@ -0,0 +1,263 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __gccfeatures_dot_hpp +#define __gccfeatures_dot_hpp + +#define RANDOM_ITERATOR_R123_GNUC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) + +#if !defined(__x86_64__) && !defined(__i386__) && !defined(__powerpc__) && !defined(__arm__) && !defined(__aarch64__) +# error "This code has only been tested on x86, powerpc and a few arm platforms." +#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task> +{ /* maybe an unbalanced brace will terminate the compilation */ + /* Feel free to try the Random123 library on other architectures by changing + the conditions that reach this error, but you should consider it a + porting exercise and expect to encounter bugs and deficiencies. + Please let the authors know of any successes (or failures). */ +#endif + +#ifdef __powerpc__ +#include <ppu_intrinsics.h> +#endif + +#ifndef RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static __inline__ +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#if RANDOM_ITERATOR_R123_GNUC_VERSION >= 40000 +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#else +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely) +#endif + +/* According to the C++0x standard, we should be able to test the numeric + value of __cplusplus == 199701L for C++98, __cplusplus == 201103L for C++11 + But gcc has had an open bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 + since early 2001, which was finally fixed in 4.7 (early 2012). For + earlier versions, the only way to detect whether --std=c++0x was requested + on the command line is to look at the __GCC_EXPERIMENTAL_CXX0X__ pp-symbol. +*/ +#if defined(__GCC_EXPERIMENTAL_CXX0X__) +#define GNU_CXX11 (__cplusplus>=201103L || (RANDOM_ITERATOR_R123_GNUC_VERSION<40700 && 1/* defined(__GCC_EXPERIMENTAL_CXX0X__) */)) +#else +#define GNU_CXX11 (__cplusplus>=201103L || (RANDOM_ITERATOR_R123_GNUC_VERSION<40700 && 0/* defined(__GCC_EXPERIMENTAL_CXX0X__) */)) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS ((RANDOM_ITERATOR_R123_GNUC_VERSION >= 40600) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT +#define RANDOM_ITERATOR_R123_USE_CXX11_STATIC_ASSERT ((RANDOM_ITERATOR_R123_GNUC_VERSION >= 40300) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR +#define RANDOM_ITERATOR_R123_USE_CXX11_CONSTEXPR ((RANDOM_ITERATOR_R123_GNUC_VERSION >= 40600) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS +#define RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS ((RANDOM_ITERATOR_R123_GNUC_VERSION >= 40500) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_RANDOM +#define RANDOM_ITERATOR_R123_USE_CXX11_RANDOM ((RANDOM_ITERATOR_R123_GNUC_VERSION>=40500) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#define RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS ((RANDOM_ITERATOR_R123_GNUC_VERSION>=40400) && GNU_CXX11) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#ifdef __AES__ +#define RANDOM_ITERATOR_R123_USE_AES_NI 1 +#else +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#ifdef __SSE4_2__ +#define RANDOM_ITERATOR_R123_USE_SSE4_2 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#ifdef __SSE4_1__ +#define RANDOM_ITERATOR_R123_USE_SSE4_1 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +/* There's no point in trying to compile SSE code in Random123 + unless SSE2 is available. */ +#ifdef __SSE2__ +#define RANDOM_ITERATOR_R123_USE_SSE 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_OPENSSL +/* There isn't really a good way to tell at compile time whether + openssl is available. Without a pre-compilation configure-like + tool, it's less error-prone to guess that it isn't available. Add + -DRANDOM_ITERATOR_R123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#if defined(__x86_64__) || defined(__aarch64__) +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 1 +#else +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#if (defined(__x86_64__)||defined(__i386__)) +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#else +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#if (defined(__x86_64__)||defined(__i386__)) +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H (1/* (defined(__x86_64__)||defined(__i386__)) */ && RANDOM_ITERATOR_R123_GNUC_VERSION >= 40402) +#else +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H (0/* (defined(__x86_64__)||defined(__i386__)) */ && RANDOM_ITERATOR_R123_GNUC_VERSION >= 40402) +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +/* gcc -m64 on Solaris 10 defines __SSE2__ but doesn't have + emmintrin.h in the include search path. This is + so broken that I refuse to try to work around it. If this + affects you, figure out where your emmintrin.h lives and + add an appropriate -I to your CPPFLAGS. Or add -DRANDOM_ITERATOR_R123_USE_SSE=0. */ +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H (RANDOM_ITERATOR_R123_USE_SSE && (RANDOM_ITERATOR_R123_GNUC_VERSION < 40402)) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H ((RANDOM_ITERATOR_R123_USE_SSE4_1 || RANDOM_ITERATOR_R123_USE_SSE4_2) && (RANDOM_ITERATOR_R123_GNUC_VERSION < 40402)) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +#if (defined(__powerpc64__)) +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 1 +#else +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN __mulhdu +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN __mulhwu +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +/* If you add something, it must go in all the other XXfeatures.hpp + and in ../ut_features.cpp */ +#endif diff --git a/random_iterator/detail/Random123/features/iccfeatures.h b/random_iterator/detail/Random123/features/iccfeatures.h new file mode 100644 index 0000000..d41f139 --- /dev/null +++ b/random_iterator/detail/Random123/features/iccfeatures.h @@ -0,0 +1,212 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __icpcfeatures_dot_hpp +#define __icpcfeatures_dot_hpp + +// icc relies on gcc libraries and other toolchain components. +#define RANDOM_ITERATOR_R123_GNUC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) + +#if !defined(__x86_64__) && !defined(__i386__) +# error "This code has only been tested on x86 platforms." +{ // maybe an unbalanced brace will terminate the compilation +// You are invited to try Easy123 on other architectures, by changing +// the conditions that reach this error, but you should consider it a +// porting exercise and expect to encounter bugs and deficiencies. +// Please let the authors know of any successes (or failures). +#endif + +#ifndef RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely) +#endif + +// The basic idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #if some condition +// #define RANDOM_ITERATOR_R123_SOMETHING 1 +// #else +// #define RANDOM_ITERATOR_R123_SOMETHING 0 +// #endif +// #endif +// This idiom allows an external user to override any decision +// in this file with a command-line -DRANDOM_ITERATOR_R123_SOMETHING=1 or -DRANDOM_ITERATOR_R123_SOMETHINE=0 + +// An alternative idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #define RANDOM_ITERATOR_R123_SOMETHING (some boolean expression) +// #endif +// where the boolean expression might contain previously-defined RANDOM_ITERATOR_R123_SOMETHING_ELSE +// pp-symbols. + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#ifdef __SSE4_2__ +#define RANDOM_ITERATOR_R123_USE_SSE4_2 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#ifdef __SSE4_1__ +#define RANDOM_ITERATOR_R123_USE_SSE4_1 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#ifdef __SSE2__ +#define RANDOM_ITERATOR_R123_USE_SSE 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +// Unlike gcc, icc (version 12) does not pre-define an __AES__ +// pp-symbol when -maes or -xHost is on the command line. This feels +// like a defect in icc (it defines __SSE4_2__ in analogous +// circumstances), but until Intel fixes it, we're better off erring +// on the side of caution and not generating instructions that are +// going to raise SIGILL when executed. To get the AES-NI +// instructions with icc, the caller must puts something like +// -DRANDOM_ITERATOR_R123_USE_AES_NI=1 or -D__AES__ on the command line. FWIW, the +// AES-NI Whitepaper by Gueron says that icc has supported AES-NI from +// 11.1 onwards. +// +#if defined(__AES__) +#define RANDOM_ITERATOR_R123_USE_AES_NI ((__ICC>=1101) && 1/*defined(__AES__)*/) +#else +#define RANDOM_ITERATOR_R123_USE_AES_NI ((__ICC>=1101) && 0/*defined(__AES__)*/) +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_OPENSSL +/* There isn't really a good way to tell at compile time whether + openssl is available. Without a pre-compilation configure-like + tool, it's less error-prone to guess that it isn't available. Add + -DRANDOM_ITERATOR_R123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO16_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO16_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +// If you add something, it must go in all the other XXfeatures.hpp +// and in ../ut_features.cpp +#endif diff --git a/random_iterator/detail/Random123/features/metalfeatures.h b/random_iterator/detail/Random123/features/metalfeatures.h new file mode 100644 index 0000000..d31e86b --- /dev/null +++ b/random_iterator/detail/Random123/features/metalfeatures.h @@ -0,0 +1,111 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Written by Tom Schoonjans <Tom.Schoonjans@me.com> + */ + +#ifndef __metalfeatures_dot_hpp +#define __metalfeatures_dot_hpp + +#ifndef RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE +#define RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE thread +#endif + +#ifndef RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE +#define RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE constant +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#define RANDOM_ITERATOR_R123_ASSERT(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN 1 +#endif + +#if RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#include <metal_integer> +#define RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN metal::mulhi +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_64BIT +#define RANDOM_ITERATOR_R123_USE_64BIT 0 /* Metal currently (Feb 2019, Specification-2) does not support 64-bit variable types */ +#endif + +#ifndef RANDOM_ITERATOR_R123_ULONG_LONG +/* the longest integer type in Metal (Feb 2019, Specification-2) is a + * 32-bit unsigned int. Let's hope for the best... */ +#define RANDOM_ITERATOR_R123_ULONG_LONG unsigned int +#endif + +#endif diff --git a/random_iterator/detail/Random123/features/msvcfeatures.h b/random_iterator/detail/Random123/features/msvcfeatures.h new file mode 100644 index 0000000..894d578 --- /dev/null +++ b/random_iterator/detail/Random123/features/msvcfeatures.h @@ -0,0 +1,200 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __msvcfeatures_dot_hpp +#define __msvcfeatures_dot_hpp + +//#if _MSVC_FULL_VER <= 15 +//#error "We've only tested MSVC_FULL_VER==15." +//#endif + +#if !defined(_M_IX86) && !defined(_M_X64) +# error "This code has only been tested on x86 platforms." +{ // maybe an unbalanced brace will terminate the compilation +// You are invited to try Random123 on other architectures, by changing +// the conditions that reach this error, but you should consider it a +// porting exercise and expect to encounter bugs and deficiencies. +// Please let the authors know of any successes (or failures). +#endif + +#ifndef RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static __inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) _forceinline decl +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +// The basic idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #if some condition +// #define RANDOM_ITERATOR_R123_SOMETHING 1 +// #else +// #define RANDOM_ITERATOR_R123_SOMETHING 0 +// #endif +// #endif +// This idiom allows an external user to override any decision +// in this file with a command-line -DRANDOM_ITERATOR_R123_SOMETHING=1 or -DRANDOM_ITERATOR_R123_SOMETHINE=0 + +// An alternative idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #define RANDOM_ITERATOR_R123_SOMETHING (some boolean expression) +// #endif +// where the boolean expression might contain previously-defined RANDOM_ITERATOR_R123_SOMETHING_ELSE +// pp-symbols. + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#if defined(_M_X64) +#define RANDOM_ITERATOR_R123_USE_AES_NI 1 +#else +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#if defined(_M_X64) +#define RANDOM_ITERATOR_R123_USE_SSE4_2 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#if defined(_M_X64) +#define RANDOM_ITERATOR_R123_USE_SSE4_1 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#define RANDOM_ITERATOR_R123_USE_SSE 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_OPENSSL +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO16_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO16_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#if defined(_M_X64) +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 1 +#else +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +#pragma warning(disable:4244) +#pragma warning(disable:4996) + +// If you add something, it must go in all the other XXfeatures.hpp +// and in ../ut_features.cpp +#endif diff --git a/random_iterator/detail/Random123/features/nvccfeatures.h b/random_iterator/detail/Random123/features/nvccfeatures.h new file mode 100644 index 0000000..cf5d3bc --- /dev/null +++ b/random_iterator/detail/Random123/features/nvccfeatures.h @@ -0,0 +1,125 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __r123_nvcc_features_dot_h__ +#define __r123_nvcc_features_dot_h__ + +#if !defined(CUDART_VERSION) +#error "why are we in nvccfeatures.h if CUDART_VERSION is not defined" +#endif + +#if CUDART_VERSION < 4010 +#error "CUDA versions earlier than 4.1 produce incorrect results for some templated functions in namespaces. Random123 isunsupported. See comments in nvccfeatures.h" +// This test was added in Random123-1.08 (August, 2013) because we +// discovered that Ftype(maxTvalue<T>()) with Ftype=double and +// T=uint64_t in examples/uniform.hpp produces -1 for CUDA4.0 and +// earlier. We can't be sure this bug doesn't also affect invocations +// of other templated functions, e.g., essentially all of Random123. +// Thus, we no longer trust CUDA versions earlier than 4.1 even though +// we had previously tested and timed Random123 with CUDA 3.x and 4.0. +// If you feel lucky or desperate, you can change #error to #warning, but +// please take extra care to be sure that you are getting correct +// results. +#endif + +// nvcc falls through to gcc or msvc. So first define +// a couple of things and then include either gccfeatures.h +// or msvcfeatures.h + +//#ifdef __CUDA_ARCH__ allows Philox32 and Philox64 to be compiled +//for both device and host functions in CUDA by setting compiler flags +//for the device function +#ifdef __CUDA_ARCH__ +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE __device__ +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_THROW +// No exceptions in CUDA, at least upto 4.0 +#define RANDOM_ITERATOR_R123_THROW(x) RANDOM_ITERATOR_R123_ASSERT(0) +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#define RANDOM_ITERATOR_R123_ASSERT(x) if((x)) ; else asm("trap;") +#endif + +#else // ! __CUDA_ARCH__ +// If we're using nvcc not compiling for the CUDA architecture, +// then we must be compiling for the host. In that case, +// tell the philox code to use the mulhilo64 asm because +// nvcc doesn't grok uint128_t. +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 1 +#endif + +#endif // __CUDA_ARCH__ + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_ULONG_LONG +// uint64_t, which is what we'd get without this, is +// not the same as unsigned long long +#define RANDOM_ITERATOR_R123_ULONG_LONG unsigned long long +#endif + +#if defined(__GNUC__) +#include "gccfeatures.h" +#elif defined(_MSC_FULL_VER) +#include "msvcfeatures.h" +#endif + +#endif diff --git a/random_iterator/detail/Random123/features/open64features.h b/random_iterator/detail/Random123/features/open64features.h new file mode 100644 index 0000000..fc86f1a --- /dev/null +++ b/random_iterator/detail/Random123/features/open64features.h @@ -0,0 +1,50 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __open64features_dot_hpp +#define __open64features_dot_hpp + +/* The gcc features are mostly right. We just override a few and then include gccfeatures.h */ + +/* Open64 4.2.3 and 4.2.4 accept the __uint128_t code without complaint + but produce incorrect code for 64-bit philox. The MULHILO64_ASM + seems to work fine */ +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 1 +#endif + +#include "gccfeatures.h" + +#endif diff --git a/random_iterator/detail/Random123/features/openclfeatures.h b/random_iterator/detail/Random123/features/openclfeatures.h new file mode 100644 index 0000000..81b8fec --- /dev/null +++ b/random_iterator/detail/Random123/features/openclfeatures.h @@ -0,0 +1,89 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __openclfeatures_dot_hpp +#define __openclfeatures_dot_hpp + +#ifndef RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((always_inline)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#define RANDOM_ITERATOR_R123_ASSERT(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +// XXX ATI APP SDK 2.4 clBuildProgram SEGVs if one uses uint64_t instead of +// ulong to mul_hi. And gets lots of complaints from stdint.h +// on some machines. +// But these typedefs mean we cannot include stdint.h with +// these headers? Do we need RANDOM_ITERATOR_R123_64T, RANDOM_ITERATOR_R123_32T, RANDOM_ITERATOR_R123_8T? +typedef ulong uint64_t; +typedef uint uint32_t; +typedef uchar uint8_t; +#define UINT64_C(x) ((ulong)(x##UL)) + +#endif diff --git a/random_iterator/detail/Random123/features/pgccfeatures.h b/random_iterator/detail/Random123/features/pgccfeatures.h new file mode 100644 index 0000000..221c2ec --- /dev/null +++ b/random_iterator/detail/Random123/features/pgccfeatures.h @@ -0,0 +1,194 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright (c) 2013, Los Alamos National Security, LLC +All rights reserved. + +Copyright 2013. Los Alamos National Security, LLC. This software was produced +under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National +Laboratory (LANL), which is operated by Los Alamos National Security, LLC for +the U.S. Department of Energy. The U.S. Government has rights to use, +reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR LOS +ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR +ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified +to produce derivative works, such modified software should be clearly marked, +so as not to confuse it with the version available from LANL. +*/ +#ifndef __pgccfeatures_dot_hpp +#define __pgccfeatures_dot_hpp + +#if !defined(__x86_64__) && !defined(__i386__) +# error "This code has only been tested on x86 platforms." +#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task> +{ /* maybe an unbalanced brace will terminate the compilation */ + /* Feel free to try the Random123 library on other architectures by changing + the conditions that reach this error, but you should consider it a + porting exercise and expect to encounter bugs and deficiencies. + Please let the authors know of any successes (or failures). */ +#endif + +#ifndef RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static inline +#endif + +/* Found this example in PGI's emmintrin.h. */ +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) (expr) +#endif + +/* PGI through 13.2 doesn't appear to support AES-NI. */ +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +/* PGI through 13.2 appears to support MMX, SSE, SSE3, SSE3, SSSE3, SSE4a, and + ABM, but not SSE4.1 or SSE4.2. */ +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +/* There's no point in trying to compile SSE code in Random123 + unless SSE2 is available. */ +#ifdef __SSE2__ +#define RANDOM_ITERATOR_R123_USE_SSE 1 +#else +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_OPENSSL +/* There isn't really a good way to tell at compile time whether + openssl is available. Without a pre-compilation configure-like + tool, it's less error-prone to guess that it isn't available. Add + -DRANDOM_ITERATOR_R123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 0 +#endif + +/* emmintrin.h from PGI #includes xmmintrin.h but then complains at link time + about undefined references to _mm_castsi128_ps(__m128i). Why? */ +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#ifdef __ABM__ +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 1 +#else +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +/* If you add something, it must go in all the other XXfeatures.hpp + and in ../ut_features.cpp */ +#endif diff --git a/random_iterator/detail/Random123/features/sse.h b/random_iterator/detail/Random123/features/sse.h new file mode 100644 index 0000000..1de01ca --- /dev/null +++ b/random_iterator/detail/Random123/features/sse.h @@ -0,0 +1,280 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _Random123_sse_dot_h__ +#define _Random123_sse_dot_h__ + +#if RANDOM_ITERATOR_R123_USE_SSE + +#if RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#include <x86intrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#include <ia32intrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#include <xmmintrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#include <emmintrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#include <smmintrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#include <wmmintrin.h> +#endif +#if RANDOM_ITERATOR_R123_USE_INTRIN_H +#include <intrin.h> +#endif +#ifdef __cplusplus +#include <iostream> +#include <limits> +#include <stdexcept> +#endif + +#if RANDOM_ITERATOR_R123_USE_ASM_GNU + +/* bit25 of CX tells us whether AES is enabled. */ +RANDOM_ITERATOR_R123_STATIC_INLINE int haveAESNI(){ + unsigned int eax, ebx, ecx, edx; + __asm__ __volatile__ ("cpuid": "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : + "a" (1)); + return (ecx>>25) & 1; +} +#elif RANDOM_ITERATOR_R123_USE_CPUID_MSVC +RANDOM_ITERATOR_R123_STATIC_INLINE int haveAESNI(){ + int CPUInfo[4]; + __cpuid(CPUInfo, 1); + return (CPUInfo[2]>>25)&1; +} +#else /* RANDOM_ITERATOR_R123_USE_CPUID_??? */ +#warning "No RANDOM_ITERATOR_R123_USE_CPUID_XXX method chosen. haveAESNI will always return false" +RANDOM_ITERATOR_R123_STATIC_INLINE int haveAESNI(){ + return 0; +} +#endif /* RANDOM_ITERATOR_R123_USE_ASM_GNU || RANDOM_ITERATOR_R123_USE_CPUID_MSVC */ + +// There is a lot of annoying and inexplicable variation in the +// SSE intrinsics available in different compilation environments. +// The details seem to depend on the compiler, the version and +// the target architecture. Rather than insisting on +// RANDOM_ITERATOR_R123_USE_feature tests for each of these in each of the +// compilerfeatures.h files we just keep the complexity localized +// to here... +#if (defined(__ICC) && __ICC<1210) || (defined(_MSC_VER) && !defined(_WIN64)) +/* Is there an intrinsic to assemble an __m128i from two 64-bit words? + If not, use the 4x32-bit intrisic instead. N.B. It looks like Intel + added _mm_set_epi64x to icc version 12.1 in Jan 2012. +*/ +RANDOM_ITERATOR_R123_STATIC_INLINE __m128i _mm_set_epi64x(uint64_t v1, uint64_t v0){ + union{ + uint64_t u64; + uint32_t u32[2]; + } u1, u0; + u1.u64 = v1; + u0.u64 = v0; + return _mm_set_epi32(u1.u32[1], u1.u32[0], u0.u32[1], u0.u32[0]); +} +#endif +/* _mm_extract_lo64 abstracts the task of extracting the low 64-bit + word from an __m128i. The _mm_cvtsi128_si64 intrinsic does the job + on 64-bit platforms. Unfortunately, both MSVC and Open64 fail + assertions in ut_M128.cpp and ut_carray.cpp when we use the + _mm_cvtsi128_si64 intrinsic. (See + https://bugs.open64.net/show_bug.cgi?id=873 for the Open64 bug). + On 32-bit platforms, there's no MOVQ, so there's no intrinsic. + Finally, even if the intrinsic exists, it may be spelled with or + without the 'x'. +*/ +#if !defined(__x86_64__) || defined(_MSC_VER) || defined(__OPEN64__) +RANDOM_ITERATOR_R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){ + union{ + uint64_t u64[2]; + __m128i m; + }u; + _mm_store_si128(&u.m, si); + return u.u64[0]; +} +#elif defined(__llvm__) || defined(__ICC) +RANDOM_ITERATOR_R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){ + return (uint64_t)_mm_cvtsi128_si64(si); +} +#else /* GNUC, others */ +/* FWIW, gcc's emmintrin.h has had the 'x' spelling + since at least gcc-3.4.4. The no-'x' spelling showed up + around 4.2. */ +RANDOM_ITERATOR_R123_STATIC_INLINE uint64_t _mm_extract_lo64(__m128i si){ + return (uint64_t)_mm_cvtsi128_si64x(si); +} +#endif +#if defined(__GNUC__) && __GNUC__ < 4 +/* the cast builtins showed up in gcc4. */ +RANDOM_ITERATOR_R123_STATIC_INLINE __m128 _mm_castsi128_ps(__m128i si){ + return (__m128)si; +} +#endif + +#ifdef __cplusplus + +struct r123m128i{ + __m128i m; +#if RANDOM_ITERATOR_R123_USE_CXX11_UNRESTRICTED_UNIONS + // C++98 forbids a union member from having *any* constructors. + // C++11 relaxes this, and allows union members to have constructors + // as long as there is a "trivial" default construtor. So in C++11 + // we can provide a r123m128i constructor with an __m128i argument, and still + // have the default (and hence trivial) default constructor. + r123m128i() = default; + r123m128i(__m128i _m): m(_m){} +#endif + r123m128i& operator=(const __m128i& rhs){ m=rhs; return *this;} + r123m128i& operator=(RANDOM_ITERATOR_R123_ULONG_LONG n){ m = _mm_set_epi64x(0, n); return *this;} +#if RANDOM_ITERATOR_R123_USE_CXX11_EXPLICIT_CONVERSIONS + // With C++11 we can attach explicit to the bool conversion operator + // to disambiguate undesired promotions. For g++, this works + // only in 4.5 and above. + explicit operator bool() const {return _bool();} +#else + // Pre-C++11, we have to do something else. Google for the "safe bool" + // idiom for other ideas... + operator const void*() const{return _bool()?this:0;} +#endif + operator __m128i() const {return m;} + +private: +#if RANDOM_ITERATOR_R123_USE_SSE4_1 + bool _bool() const{ return !_mm_testz_si128(m,m); } +#else + bool _bool() const{ return 0xf != _mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(m, _mm_setzero_si128()))); } +#endif +}; + +RANDOM_ITERATOR_R123_STATIC_INLINE r123m128i& operator++(r123m128i& v){ + __m128i& c = v.m; + __m128i zeroone = _mm_set_epi64x(RANDOM_ITERATOR_R123_64BIT(0), RANDOM_ITERATOR_R123_64BIT(1)); + c = _mm_add_epi64(c, zeroone); + //return c; +#if RANDOM_ITERATOR_R123_USE_SSE4_1 + __m128i zerofff = _mm_set_epi64x(0, ~(RANDOM_ITERATOR_R123_64BIT(0))); + if( RANDOM_ITERATOR_R123_BUILTIN_EXPECT(_mm_testz_si128(c,zerofff), 0) ){ + __m128i onezero = _mm_set_epi64x(RANDOM_ITERATOR_R123_64BIT(1), RANDOM_ITERATOR_R123_64BIT(0)); + c = _mm_add_epi64(c, onezero); + } +#else + unsigned mask = _mm_movemask_ps( _mm_castsi128_ps(_mm_cmpeq_epi32(c, _mm_setzero_si128()))); + // The low two bits of mask are 11 iff the low 64 bits of + // c are zero. + if( RANDOM_ITERATOR_R123_BUILTIN_EXPECT((mask&0x3) == 0x3, 0) ){ + __m128i onezero = _mm_set_epi64x(1,0); + c = _mm_add_epi64(c, onezero); + } +#endif + return v; +} + +RANDOM_ITERATOR_R123_STATIC_INLINE r123m128i& operator+=(r123m128i& lhs, RANDOM_ITERATOR_R123_ULONG_LONG n){ + __m128i c = lhs.m; + __m128i incr128 = _mm_set_epi64x(0, n); + c = _mm_add_epi64(c, incr128); + // return c; // NO CARRY! + + int64_t lo64 = _mm_extract_lo64(c); + if((uint64_t)lo64 < n) + c = _mm_add_epi64(c, _mm_set_epi64x(1,0)); + lhs.m = c; + return lhs; +} + +// We need this one because it's present, but never used in r123array1xm128i::incr +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator<=(RANDOM_ITERATOR_R123_ULONG_LONG, const r123m128i &){ + throw std::runtime_error("operator<=(unsigned long long, r123m128i) is unimplemented.");} + +// The comparisons aren't implemented, but if we leave them out, and +// somebody writes, e.g., M1 < M2, the compiler will do an implicit +// conversion through void*. Sigh... +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator<(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator<(r123m128i, r123m128i) is unimplemented.");} +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator<=(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator<=(r123m128i, r123m128i) is unimplemented.");} +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator>(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator>(r123m128i, r123m128i) is unimplemented.");} +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator>=(const r123m128i&, const r123m128i&){ + throw std::runtime_error("operator>=(r123m128i, r123m128i) is unimplemented.");} + +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator==(const r123m128i &lhs, const r123m128i &rhs){ + return 0xf==_mm_movemask_ps(_mm_castsi128_ps(_mm_cmpeq_epi32(lhs, rhs))); } +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator!=(const r123m128i &lhs, const r123m128i &rhs){ + return !(lhs==rhs);} +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator==(RANDOM_ITERATOR_R123_ULONG_LONG lhs, const r123m128i &rhs){ + r123m128i LHS; LHS.m=_mm_set_epi64x(0, lhs); return LHS == rhs; } +RANDOM_ITERATOR_R123_STATIC_INLINE bool operator!=(RANDOM_ITERATOR_R123_ULONG_LONG lhs, const r123m128i &rhs){ + return !(lhs==rhs);} +RANDOM_ITERATOR_R123_STATIC_INLINE std::ostream& operator<<(std::ostream& os, const r123m128i& m){ + union{ + uint64_t u64[2]; + __m128i m; + }u; + _mm_storeu_si128(&u.m, m.m); + return os << u.u64[0] << " " << u.u64[1]; +} + +RANDOM_ITERATOR_R123_STATIC_INLINE std::istream& operator>>(std::istream& is, r123m128i& m){ + uint64_t u64[2]; + is >> u64[0] >> u64[1]; + m.m = _mm_set_epi64x(u64[1], u64[0]); + return is; +} + +template<typename T> inline T assemble_from_u32(uint32_t *p32); // forward declaration + +template <> +inline r123m128i assemble_from_u32<r123m128i>(uint32_t *p32){ + r123m128i ret; + ret.m = _mm_set_epi32(p32[3], p32[2], p32[1], p32[0]); + return ret; +} + +#else + +typedef struct { + __m128i m; +} r123m128i; + +#endif /* __cplusplus */ + +#else /* !RANDOM_ITERATOR_R123_USE_SSE */ +RANDOM_ITERATOR_R123_STATIC_INLINE int haveAESNI(){ + return 0; +} +#endif /* RANDOM_ITERATOR_R123_USE_SSE */ + +#endif /* _Random123_sse_dot_h__ */ diff --git a/random_iterator/detail/Random123/features/sunprofeatures.h b/random_iterator/detail/Random123/features/sunprofeatures.h new file mode 100644 index 0000000..747d99a --- /dev/null +++ b/random_iterator/detail/Random123/features/sunprofeatures.h @@ -0,0 +1,172 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __sunprofeatures_dot_hpp +#define __sunprofeatures_dot_hpp + +#ifndef RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) expr +#endif + +// The basic idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #if some condition +// #define RANDOM_ITERATOR_R123_SOMETHING 1 +// #else +// #define RANDOM_ITERATOR_R123_SOMETHING 0 +// #endif +// #endif +// This idiom allows an external user to override any decision +// in this file with a command-line -DRANDOM_ITERATOR_R123_SOMETHING=1 or -DRANDOM_ITERATOR_R123_SOMETHINE=0 + +// An alternative idiom is: +// #ifndef RANDOM_ITERATOR_R123_SOMETHING +// #define RANDOM_ITERATOR_R123_SOMETHING (some boolean expression) +// #endif +// where the boolean expression might contain previously-defined RANDOM_ITERATOR_R123_SOMETHING_ELSE +// pp-symbols. + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_OPENSSL +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO16_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO16_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_PHILOX_64BIT +#define RANDOM_ITERATOR_R123_USE_PHILOX_64BIT 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +// If you add something, it must go in all the other XXfeatures.hpp +// and in ../ut_features.cpp +#endif diff --git a/random_iterator/detail/Random123/features/xlcfeatures.h b/random_iterator/detail/Random123/features/xlcfeatures.h new file mode 100644 index 0000000..d11006d --- /dev/null +++ b/random_iterator/detail/Random123/features/xlcfeatures.h @@ -0,0 +1,210 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Copyright (c) 2013, Los Alamos National Security, LLC +All rights reserved. + +Copyright 2013. Los Alamos National Security, LLC. This software was produced +under U.S. Government contract DE-AC52-06NA25396 for Los Alamos National +Laboratory (LANL), which is operated by Los Alamos National Security, LLC for +the U.S. Department of Energy. The U.S. Government has rights to use, +reproduce, and distribute this software. NEITHER THE GOVERNMENT NOR LOS +ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR +ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified +to produce derivative works, such modified software should be clearly marked, +so as not to confuse it with the version available from LANL. +*/ +#ifndef __xlcfeatures_dot_hpp +#define __xlcfeatures_dot_hpp + +#if !defined(__x86_64__) && !defined(__i386__) && !defined(__powerpc__) +# error "This code has only been tested on x86 and PowerPC platforms." +#include <including_a_nonexistent_file_will_stop_some_compilers_from_continuing_with_a_hopeless_task> +{ /* maybe an unbalanced brace will terminate the compilation */ + /* Feel free to try the Random123 library on other architectures by changing + the conditions that reach this error, but you should consider it a + porting exercise and expect to encounter bugs and deficiencies. + Please let the authors know of any successes (or failures). */ +#endif + +#ifdef __cplusplus +/* builtins are automatically available to xlc. To use them with xlc++, + one must include builtins.h. c.f + http://publib.boulder.ibm.com/infocenter/cellcomp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.cell.doc/compiler_ref/compiler_builtins.html +*/ +#include <builtins.h> +#endif + +#ifndef RANDOM_ITERATOR_R123_STATIC_INLINE +#define RANDOM_ITERATOR_R123_STATIC_INLINE static inline +#endif + +#ifndef RANDOM_ITERATOR_R123_FORCE_INLINE +#define RANDOM_ITERATOR_R123_FORCE_INLINE(decl) decl __attribute__((__always_inline__)) +#endif + +#ifndef RANDOM_ITERATOR_R123_CUDA_DEVICE +#define RANDOM_ITERATOR_R123_CUDA_DEVICE +#endif + +#ifndef RANDOM_ITERATOR_R123_ASSERT +#include <assert.h> +#define RANDOM_ITERATOR_R123_ASSERT(x) assert(x) +#endif + +#ifndef RANDOM_ITERATOR_R123_BUILTIN_EXPECT +#define RANDOM_ITERATOR_R123_BUILTIN_EXPECT(expr,likely) __builtin_expect(expr,likely) +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_NI +#define RANDOM_ITERATOR_R123_USE_AES_NI 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_2 +#define RANDOM_ITERATOR_R123_USE_SSE4_2 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE4_1 +#define RANDOM_ITERATOR_R123_USE_SSE4_1 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SSE +#define RANDOM_ITERATOR_R123_USE_SSE 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_AES_OPENSSL +/* There isn't really a good way to tell at compile time whether + openssl is available. Without a pre-compilation configure-like + tool, it's less error-prone to guess that it isn't available. Add + -DRANDOM_ITERATOR_R123_USE_AES_OPENSSL=1 and any necessary LDFLAGS or LDLIBS to + play with openssl */ +#define RANDOM_ITERATOR_R123_USE_AES_OPENSSL 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_GNU_UINT128 +#define RANDOM_ITERATOR_R123_USE_GNU_UINT128 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_ASM_GNU +#define RANDOM_ITERATOR_R123_USE_ASM_GNU 1 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_CPUID_MSVC +#define RANDOM_ITERATOR_R123_USE_CPUID_MSVC 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_X86INTRIN_H +#define RANDOM_ITERATOR_R123_USE_X86INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_IA32INTRIN_H +#define RANDOM_ITERATOR_R123_USE_IA32INTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_XMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_XMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_EMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_EMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_SMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_SMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_WMMINTRIN_H +#define RANDOM_ITERATOR_R123_USE_WMMINTRIN_H 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_INTRIN_H +#ifdef __ABM__ +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 1 +#else +#define RANDOM_ITERATOR_R123_USE_INTRIN_H 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#define RANDOM_ITERATOR_R123_USE_MULHILO32_ASM 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +#if (defined(__powerpc64__)) +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 1 +#else +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN 0 +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN __mulhdu +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN +#define RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN __mulhwu +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#if defined(__powerpc64__) +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM (1 /*defined(__powerpc64__)*/ && !(RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN)) +#else +#define RANDOM_ITERATOR_R123_USE_MULHILO64_ASM (0 /*defined(__powerpc64__)*/ && !(RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN)) +#endif +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN 0 +#endif + +#ifndef RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +#define RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN 0 +#endif + +#ifndef __STDC_CONSTANT_MACROS +#define __STDC_CONSTANT_MACROS +#endif +#include <stdint.h> +#ifndef UINT64_C +#error UINT64_C not defined. You must define __STDC_CONSTANT_MACROS before you #include <stdint.h> +#endif + +/* If you add something, it must go in all the other XXfeatures.hpp + and in ../ut_features.cpp */ +#endif diff --git a/random_iterator/detail/Random123/gsl_microrng.h b/random_iterator/detail/Random123/gsl_microrng.h new file mode 100644 index 0000000..d127292 --- /dev/null +++ b/random_iterator/detail/Random123/gsl_microrng.h @@ -0,0 +1,136 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef __r123_gslmicrorng_dot_h__ +#define __r123_gslmicrorng_dot_h__ + + +#include <gsl/gsl_rng.h> +#include <string.h> + +/** The macro: GSL_MICRORNG(NAME, CBRNGNAME) is the GSL + analog analog of the C++ r123::MicroURNG template. It declares a gsl_rng + type named gsl_rng_NAME which uses the underlying CBRNGNAME + and can be invoked a limited number of times between calls to NAME_reset. + + When the underlying CBRNG's \c ctr_t is an \ref arrayNxW "r123arrayNxW", + and the gsl_rng_NAME may called up to \c N*2^32 times + between calls to \c NAME_reset. + + \c NAME_reset takes a gsl_rng_NAME type, a counter and a key as arguments. + It restarts the micro-rng with a new base counter and key. + + Note that you must call NAME_reset before the first use + of a gsl_rng. NAME_reset is not called automatically by + gsl_rng_alloc(). + + @code + #include <Random123/threefry.h> + #include <Random123/gsl_microrng.h> // this file + GSL_MICRORNG(microcbrng, threefry4x64, 20) // creates gsl_rng_microcbrng + + int main(int argc, char** argv) { + gsl_rng *r = gsl_rng_alloc(gsl_rng_microcbrng); + threefry4x64_ctr_t c = {{}}; + threefry4x64_key_t k = {{}}; + + for (...) { + c.v[0] = ??; // some application variable + microcbrng_reset(r, c, k); + for (...) { + // gaussian calls r several times. It is safe for + // r to be used upto 2^20 times in this loop + something[i] = gsl_ran_gaussian(r, 1.5); + } + } + } + @endcode + +*/ + +#define GSL_MICRORNG(NAME, CBRNGNAME) \ +const gsl_rng_type *gsl_rng_##NAME; \ + \ +typedef struct{ \ + CBRNGNAME##_ctr_t ctr; \ + CBRNGNAME##_ctr_t r; \ + CBRNGNAME##_key_t key; \ + RANDOM_ITERATOR_R123_ULONG_LONG n; \ + int elem; \ +} NAME##_state; \ + \ +static unsigned long int NAME##_get(void *vstate){ \ + NAME##_state *st = (NAME##_state *)vstate; \ + const int N=sizeof(st->ctr.v)/sizeof(st->ctr.v[0]); \ + if( st->elem == 0 ){ \ + CBRNGNAME##_ctr_t c = st->ctr; \ + c.v[N-1] |= st->n<<(RANDOM_ITERATOR_R123_W(CBRNGNAME##_ctr_t)-32); \ + st->n++; \ + st->r = CBRNGNAME(c, st->key); \ + st->elem = N; \ + } \ + return 0xffffffff & st->r.v[--st->elem]; \ +} \ + \ +static double \ +NAME##_get_double (void * vstate) \ +{ \ + return NAME##_get (vstate)/4294967296.; \ +} \ + \ +static void NAME##_set(void *vstate, unsigned long int s){ \ + NAME##_state *st = (NAME##_state *)vstate; \ + (void)s; /* ignored */ \ + st->elem = 0; \ + st->n = ~0; /* will abort if _reset is not called */ \ +} \ + \ +static const gsl_rng_type NAME##_type = { \ + #NAME, \ + 0xffffffffUL, \ + 0, \ + sizeof(NAME##_state), \ + &NAME##_set, \ + &NAME##_get, \ + &NAME##_get_double \ +}; \ + \ +RANDOM_ITERATOR_R123_STATIC_INLINE void NAME##_reset(const gsl_rng* gr, CBRNGNAME##_ctr_t c, CBRNGNAME##_key_t k) { \ + NAME##_state* state = (NAME##_state *)gr->state; \ + state->ctr = c; \ + state->key = k; \ + state->n = 0; \ + state->elem = 0; \ +} \ + \ +const gsl_rng_type *gsl_rng_##NAME = &NAME##_type + +#endif diff --git a/random_iterator/detail/Random123/philox.h b/random_iterator/detail/Random123/philox.h new file mode 100644 index 0000000..92eb91a --- /dev/null +++ b/random_iterator/detail/Random123/philox.h @@ -0,0 +1,493 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _philox_dot_h_ +#define _philox_dot_h_ + +/** \cond HIDDEN_FROM_DOXYGEN */ + +#include "features/compilerfeatures.h" +#include "array.h" + + +/* +// Macros _Foo_tpl are code generation 'templates' They define +// inline functions with names obtained by mangling Foo and the +// macro arguments. E.g., +// _mulhilo_tpl(32, uint32_t, uint64_t) +// expands to a definition of: +// mulhilo32(uint32_t, uint32_t, uint32_t *, uint32_t *) +// We then 'instantiate the template' to define +// several different functions, e.g., +// mulhilo32 +// mulhilo64 +// These functions will be visible to user code, and may +// also be used later in subsequent templates and definitions. + +// A template for mulhilo using a temporary of twice the word-width. +// Gcc figures out that this can be reduced to a single 'mul' instruction, +// despite the apparent use of double-wide variables, shifts, etc. It's +// obviously not guaranteed that all compilers will be that smart, so +// other implementations might be preferable, e.g., using an intrinsic +// or an asm block. On the other hand, for 32-bit multiplies, +// this *is* perfectly standard C99 - any C99 compiler should +// understand it and produce correct code. For 64-bit multiplies, +// it's only usable if the compiler recognizes that it can do +// arithmetic on a 128-bit type. That happens to be true for gcc on +// x86-64, and powerpc64 but not much else. +*/ +#define _mulhilo_dword_tpl(W, Word, Dword) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \ + Dword product = ((Dword)a)*((Dword)b); \ + *hip = product>>W; \ + return (Word)product; \ +} + +/* +// A template for mulhilo using gnu-style asm syntax. +// INSN can be "mulw", "mull" or "mulq". +// FIXME - porting to other architectures, we'll need still-more conditional +// branching here. Note that intrinsics are usually preferable. +*/ +#ifdef __powerpc__ +#define _mulhilo_asm_tpl(W, Word, INSN) \ +RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){ \ + Word dx = 0; \ + __asm__("\n\t" \ + INSN " %0,%1,%2\n\t" \ + : "=r"(dx) \ + : "r"(b), "r"(ax) \ + ); \ + *hip = dx; \ + return ax*b; \ +} +#else +#define _mulhilo_asm_tpl(W, Word, INSN) \ +RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word ax, Word b, Word *hip){ \ + Word dx; \ + __asm__("\n\t" \ + INSN " %2\n\t" \ + : "=a"(ax), "=d"(dx) \ + : "r"(b), "0"(ax) \ + ); \ + *hip = dx; \ + return ax; \ +} +#endif /* __powerpc__ */ + +/* +// A template for mulhilo using MSVC-style intrinsics +// For example,_umul128 is an msvc intrinsic, c.f. +// http://msdn.microsoft.com/en-us/library/3dayytw9.aspx +*/ +#define _mulhilo_msvc_intrin_tpl(W, Word, INTRIN) \ +RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word* hip){ \ + return INTRIN(a, b, hip); \ +} + +/* N.B. This really should be called _mulhilo_mulhi_intrin. It just + happens that CUDA was the first time we used the idiom. */ +#define _mulhilo_cuda_intrin_tpl(W, Word, INTRIN) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE Word* hip){ \ + *hip = INTRIN(a, b); \ + return a*b; \ +} + +/* +// A template for mulhilo using only word-size operations and +// C99 operators (no adc, no mulhi). It +// requires four multiplies and a dozen or so shifts, adds +// and tests. It's *SLOW*. It can be used to +// implement philoxNx32 on platforms that completely lack +// 64-bit types, e.g., Metal. +// On 32-bit platforms, it could be used to +// implement philoxNx64, but on such platforms both the philoxNx32 +// and the threefryNx64 cbrngs are going to have much better +// performance. It is enabled below by RANDOM_ITERATOR_R123_USE_MULHILO64_C99, +// but that is currently (Feb 2019) only set by +// features/metalfeatures.h headers. It can, of course, be +// set with a compile-time -D option. +*/ +#define _mulhilo_c99_tpl(W, Word) \ +RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, RANDOM_ITERATOR_R123_METAL_THREAD_ADDRESS_SPACE Word *hip){ \ + const unsigned WHALF = W/2; \ + const Word LOMASK = ((((Word)1)<<WHALF)-1); \ + Word lo = a*b; /* full low multiply */ \ + Word ahi = a>>WHALF; \ + Word alo = a& LOMASK; \ + Word bhi = b>>WHALF; \ + Word blo = b& LOMASK; \ + \ + Word ahbl = ahi*blo; \ + Word albh = alo*bhi; \ + \ + Word ahbl_albh = ((ahbl&LOMASK) + (albh&LOMASK)); \ + Word hi = ahi*bhi + (ahbl>>WHALF) + (albh>>WHALF); \ + hi += ahbl_albh >> WHALF; /* carry from the sum of lo(ahbl) + lo(albh) ) */ \ + /* carry from the sum with alo*blo */ \ + hi += ((lo >> WHALF) < (ahbl_albh&LOMASK)); \ + *hip = hi; \ + return lo; \ +} + +/* +// A template for mulhilo on a platform that can't do it +// We could put a C version here, but is it better to run *VERY* +// slowly or to just stop and force the user to find another CBRNG? +*/ +#define _mulhilo_fail_tpl(W, Word) \ +RANDOM_ITERATOR_R123_STATIC_INLINE Word mulhilo##W(Word a, Word b, Word *hip){ \ + RANDOM_ITERATOR_R123_STATIC_ASSERT(0, "mulhilo" #W " is not implemented on this machine\n"); \ +} + +/* +// N.B. There's an MSVC intrinsic called _emul, +// which *might* compile into better code than +// _mulhilo_dword_tpl +*/ +#if RANDOM_ITERATOR_R123_USE_MULHILO32_ASM +#ifdef __powerpc__ +_mulhilo_asm_tpl(32, uint32_t, "mulhwu") +#else +_mulhilo_asm_tpl(32, uint32_t, "mull") +#endif /* __powerpc__ */ +#else +#if RANDOM_ITERATOR_R123_USE_64BIT +_mulhilo_dword_tpl(32, uint32_t, uint64_t) +#elif RANDOM_ITERATOR_R123_USE_MULHILO32_MULHI_INTRIN +_mulhilo_cuda_intrin_tpl(32, uint32_t, RANDOM_ITERATOR_R123_MULHILO32_MULHI_INTRIN) +#else +_mulhilo_c99_tpl(32, uint32_t) +#endif +#endif + +#if RANDOM_ITERATOR_R123_USE_PHILOX_64BIT +#if RANDOM_ITERATOR_R123_USE_MULHILO64_ASM +#ifdef __powerpc64__ +_mulhilo_asm_tpl(64, uint64_t, "mulhdu") +#else +_mulhilo_asm_tpl(64, uint64_t, "mulq") +#endif /* __powerpc64__ */ +#elif RANDOM_ITERATOR_R123_USE_MULHILO64_MSVC_INTRIN +_mulhilo_msvc_intrin_tpl(64, uint64_t, _umul128) +#elif RANDOM_ITERATOR_R123_USE_MULHILO64_CUDA_INTRIN +_mulhilo_cuda_intrin_tpl(64, uint64_t, __umul64hi) +#elif RANDOM_ITERATOR_R123_USE_MULHILO64_OPENCL_INTRIN +_mulhilo_cuda_intrin_tpl(64, uint64_t, mul_hi) +#elif RANDOM_ITERATOR_R123_USE_MULHILO64_MULHI_INTRIN +_mulhilo_cuda_intrin_tpl(64, uint64_t, RANDOM_ITERATOR_R123_MULHILO64_MULHI_INTRIN) +#elif RANDOM_ITERATOR_R123_USE_GNU_UINT128 +_mulhilo_dword_tpl(64, uint64_t, __uint128_t) +#elif RANDOM_ITERATOR_R123_USE_MULHILO64_C99 +_mulhilo_c99_tpl(64, uint64_t) +#else +_mulhilo_fail_tpl(64, uint64_t) +#endif +#endif + +/* +// The multipliers and Weyl constants are "hard coded". +// To change them, you can #define them with different +// values before #include-ing this file. +// This isn't terribly elegant, but it works for C as +// well as C++. A nice C++-only solution would be to +// use template parameters in the style of <random> +*/ +#ifndef PHILOX_M2x64_0 +#define PHILOX_M2x64_0 RANDOM_ITERATOR_R123_64BIT(0xD2B74407B1CE6E93) +#endif + +#ifndef PHILOX_M4x64_0 +#define PHILOX_M4x64_0 RANDOM_ITERATOR_R123_64BIT(0xD2E7470EE14C6C93) +#endif + +#ifndef PHILOX_M4x64_1 +#define PHILOX_M4x64_1 RANDOM_ITERATOR_R123_64BIT(0xCA5A826395121157) +#endif + +#ifndef PHILOX_M2x32_0 +#define PHILOX_M2x32_0 ((uint32_t)0xd256d193) +#endif + +#ifndef PHILOX_M4x32_0 +#define PHILOX_M4x32_0 ((uint32_t)0xD2511F53) +#endif +#ifndef PHILOX_M4x32_1 +#define PHILOX_M4x32_1 ((uint32_t)0xCD9E8D57) +#endif + +#ifndef PHILOX_W64_0 +#define PHILOX_W64_0 RANDOM_ITERATOR_R123_64BIT(0x9E3779B97F4A7C15) /* golden ratio */ +#endif +#ifndef PHILOX_W64_1 +#define PHILOX_W64_1 RANDOM_ITERATOR_R123_64BIT(0xBB67AE8584CAA73B) /* sqrt(3)-1 */ +#endif + +#ifndef PHILOX_W32_0 +#define PHILOX_W32_0 ((uint32_t)0x9E3779B9) +#endif +#ifndef PHILOX_W32_1 +#define PHILOX_W32_1 ((uint32_t)0xBB67AE85) +#endif + +/** \endcond */ +#ifndef PHILOX2x32_DEFAULT_ROUNDS +#define PHILOX2x32_DEFAULT_ROUNDS 10 +#endif + +#ifndef PHILOX2x64_DEFAULT_ROUNDS +#define PHILOX2x64_DEFAULT_ROUNDS 10 +#endif + +#ifndef PHILOX4x32_DEFAULT_ROUNDS +#define PHILOX4x32_DEFAULT_ROUNDS 10 +#endif + +#ifndef PHILOX4x64_DEFAULT_ROUNDS +#define PHILOX4x64_DEFAULT_ROUNDS 10 +#endif +/** \cond HIDDEN_FROM_DOXYGEN */ + +/* The ignored fourth argument allows us to instantiate the + same macro regardless of N. */ +#define _philox2xWround_tpl(W, T) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE struct r123array2x##W _philox2x##W##round(struct r123array2x##W ctr, struct r123array1x##W key){ \ + T hi; \ + T lo = mulhilo##W(PHILOX_M2x##W##_0, ctr.v[0], &hi); \ + struct r123array2x##W out = {{hi^key.v[0]^ctr.v[1], lo}}; \ + return out; \ +} +#define _philox2xWbumpkey_tpl(W) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE struct r123array1x##W _philox2x##W##bumpkey( struct r123array1x##W key) { \ + key.v[0] += PHILOX_W##W##_0; \ + return key; \ +} + +#define _philox4xWround_tpl(W, T) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE struct r123array4x##W _philox4x##W##round(struct r123array4x##W ctr, struct r123array2x##W key){ \ + T hi0; \ + T hi1; \ + T lo0 = mulhilo##W(PHILOX_M4x##W##_0, ctr.v[0], &hi0); \ + T lo1 = mulhilo##W(PHILOX_M4x##W##_1, ctr.v[2], &hi1); \ + struct r123array4x##W out = {{hi1^ctr.v[1]^key.v[0], lo1, \ + hi0^ctr.v[3]^key.v[1], lo0}}; \ + return out; \ +} + +#define _philox4xWbumpkey_tpl(W) \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE struct r123array2x##W _philox4x##W##bumpkey( struct r123array2x##W key) { \ + key.v[0] += PHILOX_W##W##_0; \ + key.v[1] += PHILOX_W##W##_1; \ + return key; \ +} + +/** \endcond */ +#define _philoxNxW_tpl(N, Nhalf, W, T) \ +/** @ingroup PhiloxNxW */ \ +enum r123_enum_philox##N##x##W { philox##N##x##W##_rounds = PHILOX##N##x##W##_DEFAULT_ROUNDS }; \ +typedef struct r123array##N##x##W philox##N##x##W##_ctr_t; \ +typedef struct r123array##Nhalf##x##W philox##N##x##W##_key_t; \ +typedef struct r123array##Nhalf##x##W philox##N##x##W##_ukey_t; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE philox##N##x##W##_key_t philox##N##x##W##keyinit(philox##N##x##W##_ukey_t uk) { return uk; } \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE philox##N##x##W##_ctr_t philox##N##x##W##_R(unsigned int R, philox##N##x##W##_ctr_t ctr, philox##N##x##W##_key_t key) { \ + RANDOM_ITERATOR_R123_ASSERT(R<=16); \ + if(R>0){ ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>1){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>2){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>3){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>4){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>5){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>6){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>7){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>8){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>9){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>10){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>11){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>12){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>13){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>14){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + if(R>15){ key = _philox##N##x##W##bumpkey(key); ctr = _philox##N##x##W##round(ctr, key); } \ + return ctr; \ +} + +_philox2xWbumpkey_tpl(32) +_philox4xWbumpkey_tpl(32) +_philox2xWround_tpl(32, uint32_t) /* philox2x32round */ +_philox4xWround_tpl(32, uint32_t) /* philo4x32round */ + +_philoxNxW_tpl(2, 1, 32, uint32_t) /* philox2x32bijection */ +_philoxNxW_tpl(4, 2, 32, uint32_t) /* philox4x32bijection */ +#if RANDOM_ITERATOR_R123_USE_PHILOX_64BIT +/** \cond HIDDEN_FROM_DOXYGEN */ +_philox2xWbumpkey_tpl(64) +_philox4xWbumpkey_tpl(64) +_philox2xWround_tpl(64, uint64_t) /* philo2x64round */ +_philox4xWround_tpl(64, uint64_t) /* philo4x64round */ +/** \endcond */ +_philoxNxW_tpl(2, 1, 64, uint64_t) /* philox2x64bijection */ +_philoxNxW_tpl(4, 2, 64, uint64_t) /* philox4x64bijection */ +#endif /* RANDOM_ITERATOR_R123_USE_PHILOX_64BIT */ + +#define philox2x32(c,k) philox2x32_R(philox2x32_rounds, c, k) +#define philox4x32(c,k) philox4x32_R(philox4x32_rounds, c, k) +#if RANDOM_ITERATOR_R123_USE_PHILOX_64BIT +#define philox2x64(c,k) philox2x64_R(philox2x64_rounds, c, k) +#define philox4x64(c,k) philox4x64_R(philox4x64_rounds, c, k) +#endif /* RANDOM_ITERATOR_R123_USE_PHILOX_64BIT */ + +#if defined(__cplusplus) + +#define _PhiloxNxW_base_tpl(CType, KType, N, W) \ +namespace random_iterator_r123{ \ +template<unsigned int ROUNDS> \ +struct Philox##N##x##W##_R{ \ + typedef CType ctr_type; \ + typedef KType key_type; \ + typedef KType ukey_type; \ + static const RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE unsigned int rounds=ROUNDS; \ + inline RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key) const){ \ + RANDOM_ITERATOR_R123_STATIC_ASSERT(ROUNDS<=16, "philox is only unrolled up to 16 rounds\n"); \ + return philox##N##x##W##_R(ROUNDS, ctr, key); \ + } \ +}; \ +typedef Philox##N##x##W##_R<philox##N##x##W##_rounds> Philox##N##x##W; \ + } // namespace random_iterator_r123 + +_PhiloxNxW_base_tpl(r123array2x32, r123array1x32, 2, 32) // Philox2x32_R<R> +_PhiloxNxW_base_tpl(r123array4x32, r123array2x32, 4, 32) // Philox4x32_R<R> +#if RANDOM_ITERATOR_R123_USE_PHILOX_64BIT +_PhiloxNxW_base_tpl(r123array2x64, r123array1x64, 2, 64) // Philox2x64_R<R> +_PhiloxNxW_base_tpl(r123array4x64, r123array2x64, 4, 64) // Philox4x64_R<R> +#endif + +/* The _tpl macros don't quite work to do string-pasting inside comments. + so we just write out the boilerplate documentation four times... */ + +/** +@defgroup PhiloxNxW Philox Classes and Typedefs + +The PhiloxNxW classes export the member functions, typedefs and +operator overloads required by a @ref CBRNG "CBRNG" class. + +As described in +<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>. +The Philox family of counter-based RNGs use integer multiplication, xor and permutation of W-bit words +to scramble its N-word input key. Philox is a mnemonic for Product HI LO Xor). + + +@class r123::Philox2x32_R +@ingroup PhiloxNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Philox round +function will be applied. + +As of November 2011, the authors know of no statistical flaws with +ROUNDS=6 or more for Philox2x32. + +@typedef r123::Philox2x32 +@ingroup PhiloxNxW + Philox2x32 is equivalent to Philox2x32_R<10>. With 10 rounds, + Philox2x32 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Philox2x64_R +@ingroup PhiloxNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Philox round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=6 or more for Philox2x64. + +@typedef r123::Philox2x64 +@ingroup PhiloxNxW + Philox2x64 is equivalent to Philox2x64_R<10>. With 10 rounds, + Philox2x64 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Philox4x32_R +@ingroup PhiloxNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Philox round +function will be applied. + +In November 2011, the authors recorded some suspicious p-values (approximately 1.e-7) from +some very long (longer than the default BigCrush length) SimpPoker tests. Despite +the fact that even longer tests reverted to "passing" p-values, a cloud remains over +Philox4x32 with 7 rounds. The authors know of no statistical flaws with +ROUNDS=8 or more for Philox4x32. + +@typedef r123::Philox4x32 +@ingroup PhiloxNxW + Philox4x32 is equivalent to Philox4x32_R<10>. With 10 rounds, + Philox4x32 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Philox4x64_R +@ingroup PhiloxNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Philox round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=7 or more for Philox4x64. + +@typedef r123::Philox4x64 +@ingroup PhiloxNxW + Philox4x64 is equivalent to Philox4x64_R<10>. With 10 rounds, + Philox4x64 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. +*/ + +#endif /* __cplusplus */ + +#endif /* _philox_dot_h_ */ diff --git a/random_iterator/detail/Random123/threefry.h b/random_iterator/detail/Random123/threefry.h new file mode 100644 index 0000000..b5bb304 --- /dev/null +++ b/random_iterator/detail/Random123/threefry.h @@ -0,0 +1,870 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _threefry_dot_h_ +#define _threefry_dot_h_ +#include "features/compilerfeatures.h" +#include "array.h" + +/** \cond HIDDEN_FROM_DOXYGEN */ +/* Significant parts of this file were copied from + from: + Skein_FinalRnd/ReferenceImplementation/skein.h + Skein_FinalRnd/ReferenceImplementation/skein_block.c + + in http://csrc.nist.gov/groups/ST/hash/sha-3/Round3/documents/Skein_FinalRnd.zip + + This file has been modified so that it may no longer perform its originally + intended function. If you're looking for a Skein or Threefish source code, + please consult the original file. + + The original file had the following header: +************************************************************************** +** +** Interface declarations and internal definitions for Skein hashing. +** +** Source code author: Doug Whiting, 2008. +** +** This algorithm and source code is released to the public domain. +** +*************************************************************************** + +*/ + +/* See comment at the top of philox.h for the macro pre-process + strategy. */ + +/* Rotation constants: */ +enum r123_enum_threefry64x4 { + /* These are the R_256 constants from the Threefish reference sources + with names changed to R_64x4... */ + R_64x4_0_0=14, R_64x4_0_1=16, + R_64x4_1_0=52, R_64x4_1_1=57, + R_64x4_2_0=23, R_64x4_2_1=40, + R_64x4_3_0= 5, R_64x4_3_1=37, + R_64x4_4_0=25, R_64x4_4_1=33, + R_64x4_5_0=46, R_64x4_5_1=12, + R_64x4_6_0=58, R_64x4_6_1=22, + R_64x4_7_0=32, R_64x4_7_1=32 +}; + +enum r123_enum_threefry64x2 { + /* + // Output from skein_rot_search: (srs64_B64-X1000) + // Random seed = 1. BlockSize = 128 bits. sampleCnt = 1024. rounds = 8, minHW_or=57 + // Start: Tue Mar 1 10:07:48 2011 + // rMin = 0.136. #0325[*15] [CRC=455A682F. hw_OR=64. cnt=16384. blkSize= 128].format + */ + R_64x2_0_0=16, + R_64x2_1_0=42, + R_64x2_2_0=12, + R_64x2_3_0=31, + R_64x2_4_0=16, + R_64x2_5_0=32, + R_64x2_6_0=24, + R_64x2_7_0=21 + /* 4 rounds: minHW = 4 [ 4 4 4 4 ] + // 5 rounds: minHW = 8 [ 8 8 8 8 ] + // 6 rounds: minHW = 16 [ 16 16 16 16 ] + // 7 rounds: minHW = 32 [ 32 32 32 32 ] + // 8 rounds: minHW = 64 [ 64 64 64 64 ] + // 9 rounds: minHW = 64 [ 64 64 64 64 ] + //10 rounds: minHW = 64 [ 64 64 64 64 ] + //11 rounds: minHW = 64 [ 64 64 64 64 ] */ +}; + +enum r123_enum_threefry32x4 { + /* Output from skein_rot_search: (srs-B128-X5000.out) + // Random seed = 1. BlockSize = 64 bits. sampleCnt = 1024. rounds = 8, minHW_or=28 + // Start: Mon Aug 24 22:41:36 2009 + // ... + // rMin = 0.472. #0A4B[*33] [CRC=DD1ECE0F. hw_OR=31. cnt=16384. blkSize= 128].format */ + R_32x4_0_0=10, R_32x4_0_1=26, + R_32x4_1_0=11, R_32x4_1_1=21, + R_32x4_2_0=13, R_32x4_2_1=27, + R_32x4_3_0=23, R_32x4_3_1= 5, + R_32x4_4_0= 6, R_32x4_4_1=20, + R_32x4_5_0=17, R_32x4_5_1=11, + R_32x4_6_0=25, R_32x4_6_1=10, + R_32x4_7_0=18, R_32x4_7_1=20 + + /* 4 rounds: minHW = 3 [ 3 3 3 3 ] + // 5 rounds: minHW = 7 [ 7 7 7 7 ] + // 6 rounds: minHW = 12 [ 13 12 13 12 ] + // 7 rounds: minHW = 22 [ 22 23 22 23 ] + // 8 rounds: minHW = 31 [ 31 31 31 31 ] + // 9 rounds: minHW = 32 [ 32 32 32 32 ] + //10 rounds: minHW = 32 [ 32 32 32 32 ] + //11 rounds: minHW = 32 [ 32 32 32 32 ] */ + +}; + +enum r123_enum_threefry32x2 { + /* Output from skein_rot_search (srs32x2-X5000.out) + // Random seed = 1. BlockSize = 64 bits. sampleCnt = 1024. rounds = 8, minHW_or=28 + // Start: Tue Jul 12 11:11:33 2011 + // rMin = 0.334. #0206[*07] [CRC=1D9765C0. hw_OR=32. cnt=16384. blkSize= 64].format */ + R_32x2_0_0=13, + R_32x2_1_0=15, + R_32x2_2_0=26, + R_32x2_3_0= 6, + R_32x2_4_0=17, + R_32x2_5_0=29, + R_32x2_6_0=16, + R_32x2_7_0=24 + + /* 4 rounds: minHW = 4 [ 4 4 4 4 ] + // 5 rounds: minHW = 6 [ 6 8 6 8 ] + // 6 rounds: minHW = 9 [ 9 12 9 12 ] + // 7 rounds: minHW = 16 [ 16 24 16 24 ] + // 8 rounds: minHW = 32 [ 32 32 32 32 ] + // 9 rounds: minHW = 32 [ 32 32 32 32 ] + //10 rounds: minHW = 32 [ 32 32 32 32 ] + //11 rounds: minHW = 32 [ 32 32 32 32 ] */ + }; + +enum r123_enum_threefry_wcnt { + WCNT2=2, + WCNT4=4 +}; + +#if RANDOM_ITERATOR_R123_USE_64BIT +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(uint64_t RotL_64(uint64_t x, unsigned int N)); +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE uint64_t RotL_64(uint64_t x, unsigned int N) +{ + return (x << (N & 63)) | (x >> ((64-N) & 63)); +} +#endif + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(uint32_t RotL_32(uint32_t x, unsigned int N)); +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE uint32_t RotL_32(uint32_t x, unsigned int N) +{ + return (x << (N & 31)) | (x >> ((32-N) & 31)); +} + +#define SKEIN_MK_64(hi32,lo32) ((lo32) + (((uint64_t) (hi32)) << 32)) +#define SKEIN_KS_PARITY64 SKEIN_MK_64(0x1BD11BDA,0xA9FC1A22) +#define SKEIN_KS_PARITY32 0x1BD11BDA + +/** \endcond */ + +#ifndef THREEFRY2x32_DEFAULT_ROUNDS +#define THREEFRY2x32_DEFAULT_ROUNDS 20 +#endif + +#ifndef THREEFRY2x64_DEFAULT_ROUNDS +#define THREEFRY2x64_DEFAULT_ROUNDS 20 +#endif + +#ifndef THREEFRY4x32_DEFAULT_ROUNDS +#define THREEFRY4x32_DEFAULT_ROUNDS 20 +#endif + +#ifndef THREEFRY4x64_DEFAULT_ROUNDS +#define THREEFRY4x64_DEFAULT_ROUNDS 20 +#endif + +#define _threefry2x_tpl(W) \ +typedef struct r123array2x##W threefry2x##W##_ctr_t; \ +typedef struct r123array2x##W threefry2x##W##_key_t; \ +typedef struct r123array2x##W threefry2x##W##_ukey_t; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE threefry2x##W##_key_t threefry2x##W##keyinit(threefry2x##W##_ukey_t uk) { return uk; } \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE \ +threefry2x##W##_ctr_t threefry2x##W##_R(unsigned int Nrounds, threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \ + threefry2x##W##_ctr_t X; \ + uint##W##_t ks[2+1]; \ + int i; /* avoid size_t to avoid need for stddef.h */ \ + RANDOM_ITERATOR_R123_ASSERT(Nrounds<=32); \ + ks[2] = SKEIN_KS_PARITY##W; \ + for (i=0;i < 2; i++) \ + { \ + ks[i] = k.v[i]; \ + X.v[i] = in.v[i]; \ + ks[2] ^= k.v[i]; \ + } \ + \ + /* Insert initial key before round 0 */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; \ + \ + if(Nrounds>0){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>1){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>2){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>3){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>3){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; \ + X.v[1] += 1; /* X.v[2-1] += r */ \ + } \ + if(Nrounds>4){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>5){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>6){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>7){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>7){ \ + /* InjectKey(r=2) */ \ + X.v[0] += ks[2]; X.v[1] += ks[0]; \ + X.v[1] += 2; \ + } \ + if(Nrounds>8){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>9){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>10){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>11){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>11){ \ + /* InjectKey(r=3) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; \ + X.v[1] += 3; \ + } \ + if(Nrounds>12){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>13){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>14){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>15){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>15){ \ + /* InjectKey(r=4) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; \ + X.v[1] += 4; \ + } \ + if(Nrounds>16){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>17){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>18){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>19){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>19){ \ + /* InjectKey(r=5) */ \ + X.v[0] += ks[2]; X.v[1] += ks[0]; \ + X.v[1] += 5; \ + } \ + if(Nrounds>20){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>21){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>22){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>23){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>23){ \ + /* InjectKey(r=6) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; \ + X.v[1] += 6; \ + } \ + if(Nrounds>24){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_0_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>25){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_1_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>26){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_2_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>27){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_3_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>27){ \ + /* InjectKey(r=7) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; \ + X.v[1] += 7; \ + } \ + if(Nrounds>28){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_4_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>29){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_5_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>30){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_6_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>31){ X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x2_7_0); X.v[1] ^= X.v[0]; } \ + if(Nrounds>31){ \ + /* InjectKey(r=8) */ \ + X.v[0] += ks[2]; X.v[1] += ks[0]; \ + X.v[1] += 8; \ + } \ + return X; \ +} \ + /** @ingroup ThreefryNxW */ \ +enum r123_enum_threefry2x##W { threefry2x##W##_rounds = THREEFRY2x##W##_DEFAULT_ROUNDS }; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE \ +threefry2x##W##_ctr_t threefry2x##W(threefry2x##W##_ctr_t in, threefry2x##W##_key_t k){ \ + return threefry2x##W##_R(threefry2x##W##_rounds, in, k); \ +} + + +#define _threefry4x_tpl(W) \ +typedef struct r123array4x##W threefry4x##W##_ctr_t; \ +typedef struct r123array4x##W threefry4x##W##_key_t; \ +typedef struct r123array4x##W threefry4x##W##_ukey_t; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE threefry4x##W##_key_t threefry4x##W##keyinit(threefry4x##W##_ukey_t uk) { return uk; } \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE \ +threefry4x##W##_ctr_t threefry4x##W##_R(unsigned int Nrounds, threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \ + threefry4x##W##_ctr_t X; \ + uint##W##_t ks[4+1]; \ + int i; /* avoid size_t to avoid need for stddef.h */ \ + RANDOM_ITERATOR_R123_ASSERT(Nrounds<=72); \ + ks[4] = SKEIN_KS_PARITY##W; \ + for (i=0;i < 4; i++) \ + { \ + ks[i] = k.v[i]; \ + X.v[i] = in.v[i]; \ + ks[4] ^= k.v[i]; \ + } \ + \ + /* Insert initial key before round 0 */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \ + \ + if(Nrounds>0){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>1){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>2){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>3){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>3){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \ + X.v[4-1] += 1; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>4){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>5){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>6){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>7){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>7){ \ + /* InjectKey(r=2) */ \ + X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \ + X.v[4-1] += 2; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>8){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>9){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>10){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>11){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>11){ \ + /* InjectKey(r=3) */ \ + X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \ + X.v[4-1] += 3; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>12){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>13){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>14){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>15){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>15){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \ + X.v[4-1] += 4; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>16){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>17){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>18){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>19){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>19){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \ + X.v[4-1] += 5; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>20){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>21){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>22){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>23){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>23){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \ + X.v[4-1] += 6; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>24){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>25){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>26){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>27){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>27){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \ + X.v[4-1] += 7; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>28){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>29){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>30){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>31){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>31){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \ + X.v[4-1] += 8; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>32){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>33){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>34){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>35){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>35){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \ + X.v[4-1] += 9; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>36){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>37){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>38){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>39){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>39){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \ + X.v[4-1] += 10; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>40){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>41){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>42){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>43){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>43){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \ + X.v[4-1] += 11; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>44){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>45){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>46){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>47){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>47){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \ + X.v[4-1] += 12; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>48){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>49){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>50){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>51){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>51){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \ + X.v[4-1] += 13; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>52){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>53){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>54){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>55){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>55){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[4]; X.v[1] += ks[0]; X.v[2] += ks[1]; X.v[3] += ks[2]; \ + X.v[4-1] += 14; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>56){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>57){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>58){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>59){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>59){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[0]; X.v[1] += ks[1]; X.v[2] += ks[2]; X.v[3] += ks[3]; \ + X.v[4-1] += 15; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>60){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>61){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>62){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>63){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>63){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[1]; X.v[1] += ks[2]; X.v[2] += ks[3]; X.v[3] += ks[4]; \ + X.v[4-1] += 16; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>64){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_0_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_0_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>65){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_1_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_1_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>66){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_2_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_2_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>67){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_3_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_3_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>67){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[2]; X.v[1] += ks[3]; X.v[2] += ks[4]; X.v[3] += ks[0]; \ + X.v[4-1] += 17; /* X.v[WCNT4-1] += r */ \ + } \ + \ + if(Nrounds>68){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_4_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_4_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>69){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_5_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_5_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>70){ \ + X.v[0] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_6_0); X.v[1] ^= X.v[0]; \ + X.v[2] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_6_1); X.v[3] ^= X.v[2]; \ + } \ + if(Nrounds>71){ \ + X.v[0] += X.v[3]; X.v[3] = RotL_##W(X.v[3],R_##W##x4_7_0); X.v[3] ^= X.v[0]; \ + X.v[2] += X.v[1]; X.v[1] = RotL_##W(X.v[1],R_##W##x4_7_1); X.v[1] ^= X.v[2]; \ + } \ + if(Nrounds>71){ \ + /* InjectKey(r=1) */ \ + X.v[0] += ks[3]; X.v[1] += ks[4]; X.v[2] += ks[0]; X.v[3] += ks[1]; \ + X.v[4-1] += 18; /* X.v[WCNT4-1] += r */ \ + } \ + \ + return X; \ +} \ + \ + /** @ingroup ThreefryNxW */ \ +enum r123_enum_threefry4x##W { threefry4x##W##_rounds = THREEFRY4x##W##_DEFAULT_ROUNDS }; \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_FORCE_INLINE(threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k)); \ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE \ +threefry4x##W##_ctr_t threefry4x##W(threefry4x##W##_ctr_t in, threefry4x##W##_key_t k){ \ + return threefry4x##W##_R(threefry4x##W##_rounds, in, k); \ +} + +#if RANDOM_ITERATOR_R123_USE_64BIT +_threefry2x_tpl(64) +_threefry4x_tpl(64) +#endif +_threefry2x_tpl(32) +_threefry4x_tpl(32) + +/* gcc4.5 and 4.6 seem to optimize a macro-ized threefryNxW better + than a static inline function. Why? */ +#define threefry2x32(c,k) threefry2x32_R(threefry2x32_rounds, c, k) +#define threefry4x32(c,k) threefry4x32_R(threefry4x32_rounds, c, k) +#define threefry2x64(c,k) threefry2x64_R(threefry2x64_rounds, c, k) +#define threefry4x64(c,k) threefry4x64_R(threefry4x64_rounds, c, k) + +#if defined(__cplusplus) +#define _threefryNxWclass_tpl(NxW) \ +namespace random_iterator_r123{ \ +template<unsigned int ROUNDS> \ + struct Threefry##NxW##_R{ \ + typedef threefry##NxW##_ctr_t ctr_type; \ + typedef threefry##NxW##_key_t key_type; \ + typedef threefry##NxW##_key_t ukey_type; \ + static const RANDOM_ITERATOR_R123_METAL_CONSTANT_ADDRESS_SPACE unsigned int rounds=ROUNDS; \ + inline RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_FORCE_INLINE(ctr_type operator()(ctr_type ctr, key_type key)){ \ + RANDOM_ITERATOR_R123_STATIC_ASSERT(ROUNDS<=72, "threefry is only unrolled up to 72 rounds\n"); \ + return threefry##NxW##_R(ROUNDS, ctr, key); \ + } \ +}; \ + typedef Threefry##NxW##_R<threefry##NxW##_rounds> Threefry##NxW; \ +} // namespace random_iterator_r123 + +_threefryNxWclass_tpl(2x32) +_threefryNxWclass_tpl(4x32) +#if RANDOM_ITERATOR_R123_USE_64BIT +_threefryNxWclass_tpl(2x64) +_threefryNxWclass_tpl(4x64) +#endif + +/* The _tpl macros don't quite work to do string-pasting inside comments. + so we just write out the boilerplate documentation four times... */ + +/** +@defgroup ThreefryNxW Threefry Classes and Typedefs + +The ThreefryNxW classes export the member functions, typedefs and +operator overloads required by a @ref CBRNG "CBRNG" class. + +As described in +<a href="http://dl.acm.org/citation.cfm?doid=2063405"><i>Parallel Random Numbers: As Easy as 1, 2, 3</i> </a>, +the Threefry family is closely related to the Threefish block cipher from +<a href="http://www.skein-hash.info/"> Skein Hash Function</a>. +Threefry is \b not suitable for cryptographic use. + +Threefry uses integer addition, bitwise rotation, xor and permutation of words to randomize its output. + +@class r123::Threefry2x32_R +@ingroup ThreefryNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Threefry round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=13 or more for Threefry2x32. + +@typedef r123::Threefry2x32 +@ingroup ThreefryNxW + Threefry2x32 is equivalent to Threefry2x32_R<20>. With 20 rounds, + Threefry2x32 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + +@class r123::Threefry2x64_R +@ingroup ThreefryNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Threefry round +function will be applied. + +In November 2011, the authors discovered that 13 rounds of +Threefry2x64 sequenced by strided, interleaved key and counter +increments failed a very long (longer than the default BigCrush +length) WeightDistrub test. At the same time, it was confirmed that +14 rounds passes much longer tests (up to 5x10^12 samples) of a +similar nature. The authors know of no statistical flaws with +ROUNDS=14 or more for Threefry2x64. + +@typedef r123::Threefry2x64 +@ingroup ThreefryNxW + Threefry2x64 is equivalent to Threefry2x64_R<20>. With 20 rounds, + Threefry2x64 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Threefry4x32_R +@ingroup ThreefryNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Threefry round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=12 or more for Threefry4x32. + +@typedef r123::Threefry4x32 +@ingroup ThreefryNxW + Threefry4x32 is equivalent to Threefry4x32_R<20>. With 20 rounds, + Threefry4x32 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. + + + +@class r123::Threefry4x64_R +@ingroup ThreefryNxW + +exports the member functions, typedefs and operator overloads required by a @ref CBRNG "CBRNG" class. + +The template argument, ROUNDS, is the number of times the Threefry round +function will be applied. + +As of September 2011, the authors know of no statistical flaws with +ROUNDS=12 or more for Threefry4x64. + +@typedef r123::Threefry4x64 +@ingroup ThreefryNxW + Threefry4x64 is equivalent to Threefry4x64_R<20>. With 20 rounds, + Threefry4x64 has a considerable safety margin over the minimum number + of rounds with no known statistical flaws, but still has excellent + performance. +*/ + +#endif + +#endif diff --git a/random_iterator/detail/Random123/u01fixedpt.h b/random_iterator/detail/Random123/u01fixedpt.h new file mode 100644 index 0000000..64988b5 --- /dev/null +++ b/random_iterator/detail/Random123/u01fixedpt.h @@ -0,0 +1,200 @@ +/* +Copyright 2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _random123_ufixed01_dot_h_ +#define _random123_ufixed01_dot_h_ + +#include "features/compilerfeatures.h" + +/** @defgroup u01fixedpt The u01fixedpt conversion functions + + These functions convert unsigned W-bit integers to uniformly + spaced real values (float or double) between 0.0 and 1.0 with + mantissas of M bits. + + PLEASE THINK CAREFULLY BEFORE USING THESE FUNCTIONS. THEY MAY + NOT BE WHAT YOU WANT. YOU MAY BE MUCH BETTER SERVED BY THE + FUNCTIONS IN ./uniform.hpp. + + These functions produce a finite number *uniformly spaced* values + in the range from 0.0 to 1.0 with uniform probability. The price + of uniform spacing is that they may not utilize the entire space + of possible outputs. E.g., u01fixedpt_closed_open_32_24 will never + produce a non-zero value less than 2^-24, even though such values + are representable in single-precision floating point. + + There are 12 functions, corresponding to the following choices: + + - W = 32 or 64 + - M = 24 (float) or 53 (double) + - open0 or closed0 : whether the output is open or closed at 0.0 + - open1 or closed1 : whether the output is open or closed at 1.0 + + The W=64 M=24 cases are not implemented. To obtain an M=24 float + from a uint64_t, use a cast (possibly with right-shift and bitwise + and) to convert some of the bits of the uint64_t to a uint32_t and + then use u01fixedpt_x_y_32_float. Note that the 64-bit random integers + produced by the Random123 library are random in "all the bits", so + with a little extra effort you can obtain two floats this way -- + one from the high bits and one from the low bits of the 64-bit + value. + + If the output is open at one end, then the extreme + value (0.0 or 1.0) will never be returned. Conversely, if the output + is closed at one end, then the extreme value is a possible + return value. + + The values returned are as follows. All values are returned + with equal frequency, except as noted in the closed_closed case: + + closed_open: Let P=min(M,W) + there are 2^P possible output values: + {0, 1, 2, ..., 2^P-1}/2^P + + open_closed: Let P=min(M,W) + there are 2^P possible values: + {1, 2, ..., 2^P}/2^P + + open_open: Let P=min(M, W+1) + there are 2^(P-1) possible values: + {1, 3, 5, ..., 2^P-1}/2^P + + closed_closed: Let P=min(M, W-1) + there are 1+2^P possible values: + {0, 1, 2, ... 2^P}/2^P + The extreme values (0.0 and 1.0) are + returned with half the frequency of + all others. + + On x86 hardware, especially on 32bit machines, the use of + internal 80bit x87-style floating point may result in + 'bonus' precision, which may cause closed intervals to not + be really closed, i.e. the conversions below might not + convert UINT{32,64}_MAX to 1.0. This sort of issue is + likely to occur when storing the output of a u01fixedpt_*_32_float + function in a double, though one can imagine getting extra + precision artifacts when going from 64_53 as well. Other + artifacts may exist on some GPU hardware. The tests in + kat_u01_main.h try to expose such issues, but caveat emptor. + + @cond HIDDEN_FROM_DOXYGEN + */ + +/* Hex floats were standardized by C in 1999, but weren't standardized + by C++ until 2011. So, we're obliged to write out our constants in + decimal, even though they're most naturally expressed in binary. + We cross our fingers and hope that the compiler does the compile-time + constant arithmetic properly. +*/ +#define RANDOM_ITERATOR_R123_0x1p_31f (1.f/(1024.f*1024.f*1024.f*2.f)) +#define RANDOM_ITERATOR_R123_0x1p_24f (128.f*RANDOM_ITERATOR_R123_0x1p_31f) +#define RANDOM_ITERATOR_R123_0x1p_23f (256.f*RANDOM_ITERATOR_R123_0x1p_31f) +#define RANDOM_ITERATOR_R123_0x1p_32 (1./(1024.*1024.*1024.*4.)) +#define RANDOM_ITERATOR_R123_0x1p_63 (2.*RANDOM_ITERATOR_R123_0x1p_32*RANDOM_ITERATOR_R123_0x1p_32) +#define RANDOM_ITERATOR_R123_0x1p_53 (1024.*RANDOM_ITERATOR_R123_0x1p_63) +#define RANDOM_ITERATOR_R123_0x1p_52 (2048.*RANDOM_ITERATOR_R123_0x1p_63) + +/** @endcond */ + +#ifndef RANDOM_ITERATOR_R123_USE_U01_DOUBLE +#define RANDOM_ITERATOR_R123_USE_U01_DOUBLE 1 +#endif + +#ifdef __cplusplus +extern "C"{ +#endif + +/* narrowing conversions: uint32_t to float */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE float u01fixedpt_closed_closed_32_float(uint32_t i){ + /* N.B. we ignore the high bit, so output is not monotonic */ + return ((i&0x7fffffc0) + (i&0x40))*RANDOM_ITERATOR_R123_0x1p_31f; /* 0x1.p-31f */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE float u01fixedpt_closed_open_32_float(uint32_t i){ + return (i>>8)*RANDOM_ITERATOR_R123_0x1p_24f; /* 0x1.0p-24f; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE float u01fixedpt_open_closed_32_float(uint32_t i){ + return (1+(i>>8))*RANDOM_ITERATOR_R123_0x1p_24f; /* *0x1.0p-24f; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE float u01fixedpt_open_open_32_float(uint32_t i){ + return (0.5f+(i>>9))*RANDOM_ITERATOR_R123_0x1p_23f; /* 0x1.p-23f; */ +} + +#if RANDOM_ITERATOR_R123_USE_U01_DOUBLE +/* narrowing conversions: uint64_t to double */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_closed_closed_64_double(uint64_t i){ + /* N.B. we ignore the high bit, so output is not monotonic */ + return ((i&RANDOM_ITERATOR_R123_64BIT(0x7ffffffffffffe00)) + (i&0x200))*RANDOM_ITERATOR_R123_0x1p_63; /* 0x1.p-63; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_closed_open_64_double(uint64_t i){ + return (i>>11)*RANDOM_ITERATOR_R123_0x1p_53; /* 0x1.0p-53; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_open_closed_64_double(uint64_t i){ + return (1+(i>>11))*RANDOM_ITERATOR_R123_0x1p_53; /* 0x1.0p-53; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_open_open_64_double(uint64_t i){ + return (0.5+(i>>12))*RANDOM_ITERATOR_R123_0x1p_52; /* 0x1.0p-52; */ +} + +/* widening conversions: u32 to double */ +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_closed_closed_32_double(uint32_t i){ + /* j = i+(i&1) takes on 2^31+1 possible values with a 'trapezoid' distribution: + p_j = 1 0 2 0 2 .... 2 0 2 0 1 + j = 0 1 2 3 4 .... 2^32 + by converting to double *before* doing the add, we don't wrap the high bit. + */ + return (((double)(i&1)) + i)*RANDOM_ITERATOR_R123_0x1p_32; /* 0x1.p-32; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_closed_open_32_double(uint32_t i){ + return i*RANDOM_ITERATOR_R123_0x1p_32; /* 0x1.p-32; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_open_closed_32_double(uint32_t i){ + return (1.+i)*RANDOM_ITERATOR_R123_0x1p_32; /* 0x1.p-32; */ +} + +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE double u01fixedpt_open_open_32_double(uint32_t i){ + return (0.5+i)*RANDOM_ITERATOR_R123_0x1p_32; /* 0x1.p-32; */ +} +#endif /* RANDOM_ITERATOR_R123_USE_U01_DOUBLE */ + +#ifdef __cplusplus +} +#endif + +/** @} */ +#endif diff --git a/random_iterator/detail/Random123/uniform.hpp b/random_iterator/detail/Random123/uniform.hpp new file mode 100644 index 0000000..f89c533 --- /dev/null +++ b/random_iterator/detail/Random123/uniform.hpp @@ -0,0 +1,312 @@ +/* +Copyright 2010-2011, D. E. Shaw Research. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions, and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +* Neither the name of D. E. Shaw Research nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef __r123_uniform_dot_hpp +#define __r123_uniform_dot_hpp + +/** @defgroup uniform Uniform distribution scalar conversion functions + +This file provides some simple functions that can be used to convert +integers of various widths to floats and doubles with various +characteristics. It can be used to generate real-valued, uniformly +distributed random variables from the random integers produced by +the Random123 CBRNGs. + +There are three templated functions: + + - u01: output is as dense as possible in (0,1}, never 0.0. May + return 1.0 if and only if the number of output mantissa bits + is less than the width of the input. + + - uneg11: output is as dense as possible in {-1,1}, never 0.0. May + return 1.0 or -1.0 if and only if the number of output mantissa bits + is less than the width of the input. + + - u01fixedpt: output is "fixed point", equispaced, open at both ends, + and is never 0.0, 0.5 nor 1.0. + +The behavior of u01 and uneg11 depend on the pre-processor symbol: +RANDOM_ITERATOR_R123_UNIFORM_FLOAT_STORE. When #defined to a non-zero value, u01 +and uneg11 declare a volatile intermediate result, with the +intention of forcing architectures that have "extra bits" in their +floating point registers to more closely conform to IEEE +arithmetic. When compiled this way, u01 and uneg11 will be +significantly slower, as they will incur a memory write and read on +every call. Without it, they may fail the "known answer test" +implemented in ut_uniform_IEEEkat.cpp even though they perform +perfectly reasonable int to float conversions. We have used +this option to get 32-bit x86 to produce the same results as +64-bit x86-64 code, but we do not recommend it for normal +use. + +Three additional functions are defined when C++11 or newer is in use: + + - u01all + - uneg11all + - u01fixedptall + +These functions apply the corresponding conversion to every +element of their argument, which must be a staticly sized +array, e.g., an r123array or a std::array of an integer type. + +This file may not be as portable, and has not been tested as +rigorously as other files in the library, e.g., the generators. +Nevertheless, we hope it is useful and we encourage developers to +copy it and modify it for their own use. We invite comments and +improvements. +*/ + +#include <Random123/features/compilerfeatures.h> +#include <limits> +#include <cstdint> +#include <cstddef> +#if RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +#include <type_traits> +#endif +#if __cplusplus >= 201103L +#include <array> +#endif + +namespace random_iterator_r123{ +/** +@{ +@cond HIDDEN_FROM_DOXYGEN +*/ + +#if RANDOM_ITERATOR_R123_USE_CXX11_TYPE_TRAITS +using std::make_signed; +using std::make_unsigned; +#else +// Sigh... We could try to find another <type_traits>, e.g., from +// boost or TR1. Or we can do it ourselves in the r123 namespace. +// It's not clear which will cause less headache... +template <typename T> struct make_signed{}; +template <typename T> struct make_unsigned{}; +#define RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(ST, UT) \ +template<> struct make_signed<ST>{ typedef ST type; }; \ +template<> struct make_signed<UT>{ typedef ST type; }; \ +template<> struct make_unsigned<ST>{ typedef UT type; }; \ +template<> struct make_unsigned<UT>{ typedef UT type; } + +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(int8_t, uint8_t); +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(int16_t, uint16_t); +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(int32_t, uint32_t); +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(int64_t, uint64_t); +#if RANDOM_ITERATOR_R123_USE_GNU_UINT128 +RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED(__int128_t, __uint128_t); +#endif +#undef RANDOM_ITERATOR_R123_MK_SIGNED_UNSIGNED +#endif + +#if defined(__CUDACC__) || defined(_LIBCPP_HAS_NO_CONSTEXPR) +// Amazing! cuda thinks numeric_limits::max() is a __host__ function, so +// we can't use it in a device function. +// +// The LIBCPP_HAS_NO_CONSTEXP test catches situations where the libc++ +// library thinks that the compiler doesn't support constexpr, but we +// think it does. As a consequence, the library declares +// numeric_limits::max without constexpr. This workaround should only +// affect a narrow range of compiler/library pairings. +// +// In both cases, we find max() by computing ~(unsigned)0 right-shifted +// by is_signed. +template <typename T> +RANDOM_ITERATOR_R123_CONSTEXPR RANDOM_ITERATOR_R123_STATIC_INLINE RANDOM_ITERATOR_R123_CUDA_DEVICE T maxTvalue(){ + typedef typename make_unsigned<T>::type uT; + return (~uT(0)) >> std::numeric_limits<T>::is_signed; + } +#else +template <typename T> +RANDOM_ITERATOR_R123_CONSTEXPR RANDOM_ITERATOR_R123_STATIC_INLINE T maxTvalue(){ + return std::numeric_limits<T>::max(); +} +#endif +/** @endcond + @} + */ + +//! Return a uniform real value in (0, 1] +/** + @ingroup uniform + Input is a W-bit integer (signed or unsigned). It is cast to + a W-bit unsigned integer, multiplied by Ftype(2^-W) and added to + Ftype(2^(-W-1)). A good compiler should optimize it down to an + int-to-float conversion followed by a multiply and an add, which + might be fused, depending on the architecture. + + If the input is a uniformly distributed integer, and if Ftype + arithmetic follows IEEE754 round-to-nearest rules, then the + result is a uniformly distributed floating point number in (0, 1]. + +- The result is never exactly 0.0. +- The smallest value returned is 2^-(W-1). +- Let M be the number of mantissa bits in Ftype (typically 24 or 53). + - If W>M then the largest value retured is 1.0. + - If W<=M then the largest value returned is Ftype(1.0 - 2^(-W-1)). +*/ +template <typename Ftype, typename Itype> +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE Ftype u01(Itype in){ + typedef typename make_unsigned<Itype>::type Utype; + RANDOM_ITERATOR_R123_CONSTEXPR Ftype factor = Ftype(1.)/(maxTvalue<Utype>() + Ftype(1.)); + RANDOM_ITERATOR_R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor; +#if RANDOM_ITERATOR_R123_UNIFORM_FLOAT_STORE + volatile Ftype x = Utype(in)*factor; return x+halffactor; +#else + return Utype(in)*factor + halffactor; +#endif +} + +//! Return a signed value in [-1,1] +/** + @ingroup uniform + The argument is converted to a W-bit signed integer, multiplied by Ftype(2^-(W-1)) and + then added to Ftype(2^-W). A good compiler should optimize + it down to an int-to-float conversion followed by a multiply and + an add, which might be fused, depending on the architecture. + + If the input is a uniformly distributed integer, and if Ftype + arithmetic follows IEEE754 round-to-nearest rules, then the + output is a uniformly distributed floating point number in [-1, 1]. + +- The result is never exactly 0.0. +- The smallest absolute value returned is 2^-W +- Let M be the number of mantissa bits in Ftype. + - If W>M then the largest value retured is 1.0 and the smallest is -1.0. + - If W<=M then the largest value returned is the Ftype(1.0 - 2^-W) + and the smallest value returned is -Ftype(1.0 - 2^-W). +*/ +template <typename Ftype, typename Itype> +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE Ftype uneg11(Itype in){ + typedef typename make_signed<Itype>::type Stype; + RANDOM_ITERATOR_R123_CONSTEXPR Ftype factor = Ftype(1.)/(maxTvalue<Stype>() + Ftype(1.)); + RANDOM_ITERATOR_R123_CONSTEXPR Ftype halffactor = Ftype(0.5)*factor; +#if RANDOM_ITERATOR_R123_UNIFORM_FLOAT_STORE + volatile Ftype x = Stype(in)*factor; return x+halffactor; +#else + return Stype(in)*factor + halffactor; +#endif +} + +//! Return a value in (0,1) chosen from a set of equally spaced fixed-point values +/** + @ingroup uniform + Let: + - W = width of Itype, e.g., 32 or 64, regardless of signedness. + - M = mantissa bits of Ftype, e.g., 24, 53 or 64 + - B = min(M, W) + + Then the 2^(B-1) possible output values are: 2^-B*{1, 3, 5, ..., 2^B - 1} + + The smallest output is: 2^-B + + The largest output is: 1 - 2^-B + + The output is never exactly 0.0, nor 0.5, nor 1.0. + + The 2^(B-1) possible outputs: + - are equally likely, + - are uniformly spaced by 2^-(B-1), + - are balanced around 0.5 +*/ +template <typename Ftype, typename Itype> +RANDOM_ITERATOR_R123_CUDA_DEVICE RANDOM_ITERATOR_R123_STATIC_INLINE Ftype u01fixedpt(Itype in){ + typedef typename make_unsigned<Itype>::type Utype; + RANDOM_ITERATOR_R123_CONSTEXPR int excess = std::numeric_limits<Utype>::digits - std::numeric_limits<Ftype>::digits; + if(excess>=0){ + RANDOM_ITERATOR_R123_CONSTEXPR int ex_nowarn = (excess>=0) ? excess : 0; + RANDOM_ITERATOR_R123_CONSTEXPR Ftype factor = Ftype(1.)/(Ftype(1.) + ((maxTvalue<Utype>()>>ex_nowarn))); + return (1 | (Utype(in)>>ex_nowarn)) * factor; + }else + return u01<Ftype>(in); +} + +#if RANDOM_ITERATOR_R123_USE_CXX11_STD_ARRAY + +//! Apply u01 to every item in an r123array, returning a std::array +/** @ingroup uniform + * Only in C++11 and newer. + * The argument type may be any integer collection with a constexpr static_size member, + * e.g., an r123array or a std::array of an integer type. + */ +template <typename Ftype, typename CollType> +static inline +std::array<Ftype, CollType::static_size> u01all(CollType in) +{ + std::array<Ftype, CollType::static_size> ret; + size_t i=0; + for(auto e : in){ + ret[i++] = u01<Ftype>(e); + } + return ret; +} + +//! Apply uneg11 to every item in an r123array, returning a std::array +/** @ingroup uniform + * Only in C++11 and newer. + * The argument type may be any integer collection with a constexpr static_size member, + * e.g., an r123array or a std::array of an integer type. + */ +template <typename Ftype, typename CollType> +static inline +std::array<Ftype, CollType::static_size> uneg11all(CollType in) +{ + std::array<Ftype, CollType::static_size> ret; + size_t i=0; + for(auto e : in){ + ret[i++] = uneg11<Ftype>(e); + } + return ret; +} + +//! Apply u01fixedpt to every item in an r123array, returning a std::array +/** @ingroup uniform + * Only in C++11 and newer. + * The argument type may be any integer collection with a constexpr static_size member, + * e.g., an r123array or a std::array of an integer type. +*/ +template <typename Ftype, typename CollType> +static inline +std::array<Ftype, CollType::static_size> u01fixedptall(CollType in) +{ + std::array<Ftype, CollType::static_size> ret; + size_t i=0; + for(auto e : in){ + ret[i++] = u01fixedpt<Ftype>(e); + } + return ret; +} +#endif // __cplusplus >= 201103L + +} // namespace random_iterator_r123 + +#endif + diff --git a/random_iterator/detail/SplitMix.hpp b/random_iterator/detail/SplitMix.hpp new file mode 100644 index 0000000..03a6b15 --- /dev/null +++ b/random_iterator/detail/SplitMix.hpp @@ -0,0 +1,57 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * SplitMix.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +namespace random_iterator { + +namespace detail { + +template<typename UIntType> +inline UIntType splitmix( UIntType& ); + + +template<> +inline uint32_t splitmix<uint32_t>(uint32_t& x) { + uint32_t z = (x += 0x6D2B79F5UL); + z = (z ^ (z >> 15)) * (z | 1UL); + z ^= z + (z ^ (z >> 7)) * (z | 61UL); + return z ^ (z >> 14); +} + +template<> +inline uint64_t splitmix<uint64_t>(uint64_t& x){ + uint64_t z = (x += 0x9e3779b97f4a7c15); + z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; + z = (z ^ (z >> 27)) * 0x94d049bb133111eb; + return z ^ (z >> 31); +} + + +} // namespace detail + +} // namespace random_iterator diff --git a/random_iterator/detail/Squares3.hpp b/random_iterator/detail/Squares3.hpp new file mode 100644 index 0000000..0acd748 --- /dev/null +++ b/random_iterator/detail/Squares3.hpp @@ -0,0 +1,149 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * Squares3.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include <random_iterator/detail/SquaresKeys.hpp> + +namespace random_iterator { + +namespace detail { + +/* +* Three round counter-based middle square +* +* squares3 - returns a 32-bit unsigned int [0,0xffffffff] +* +* +* Three rounds of squaring are performed and the result is returned. +* For the first two rounds, the result is rotated right 32 bits. +* This places the random data in the best position for the next round. +* y = ctr*key or z = (ctr+1)*key is added on each round. For keys +* generated by the key utility, either ctr*key or (ctr+1)*key will +* have non-zero digits. This improves randomization and also provides +* for a uniform output. +* +* Note: The squares RNG was based on ideas derived from Middle Square +* Weyl Sequence RNG. One of the ideas was to obtain uniformity by adding +* the Weyl sequence after squaring. Richard P. Brent (creator of the +* xorgens RNG) suggested this method. It turns out that adding ctr*key +* is equivalent. Brent's idea provides the basis for uniformity in this +* generator. +* +* Implementation of the algorithm authored by Bernard Widynski and +* described in https://arxiv.org/pdf/2004.06278v2.pdf +*/ + +class Squares3 +{ + +public: + + typedef uint64_t init_type; + typedef uint64_t state_type; + typedef uint64_t seed_type; + typedef uint64_t advance_type; + typedef uint32_t result_type; + + Squares3()=delete; + + Squares3(seed_type s, uint32_t a=0): + state_(0), + seed_(seed_type{ splitmix<seed_type>(s) }) + {} + + Squares3( Squares3 const& other): + state_(other.getState() ), + seed_(other.getSeed() ) + {} + + inline Squares3& operator=( Squares3 const& other) + { + if(this==&other) return *this; + + state_ = other.getState(); + seed_ = other.getSeed(); + + return *this; + } + + + inline result_type operator()(void) + { + uint64_t x, y, z; + + y = x = seed_*state_ ; z = y + seed_; + + x = x*x + y; x = (x>>32) | (x<<32); /* round 1 */ + + x = x*x + z; x = (x>>32) | (x<<32); /* round 2 */ + + ++state_; /* advance state */ + + return (x*x + y) >> 32; /* round 3 */ + + } + + inline void discard(advance_type n){ + + state_ += n; + } + + inline seed_type getSeed() const { + return seed_; + } + + inline void setSeed(seed_type seed) { + seed_ = seed; + } + + inline state_type getState() const { + return state_; + } + + inline void setState( state_type state) { + state_ = state; + } + + inline static uint64_t generateSeed( size_t i ){ + return keys[i]; + } + + static constexpr result_type min(){ return 0;} + + static constexpr result_type max(){ return std::numeric_limits<result_type>::max();} + +private: + + state_type state_; + seed_type seed_; +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/random_iterator/detail/Squares4.hpp b/random_iterator/detail/Squares4.hpp new file mode 100644 index 0000000..e024d09 --- /dev/null +++ b/random_iterator/detail/Squares4.hpp @@ -0,0 +1,130 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * Squares4.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include <random_iterator/detail/SquaresKeys.hpp> + +namespace random_iterator { + +namespace detail { + +class Squares4 +{ + +public: + + typedef uint64_t init_type; + typedef uint64_t state_type; + typedef uint64_t seed_type; + typedef uint64_t advance_type; + typedef uint32_t result_type; + + Squares4()=delete; + + Squares4(seed_type s, uint32_t a=0): + state_(0), + seed_(seed_type{ splitmix<seed_type>(s)}) + {} + + Squares4( Squares4 const& other): + state_(other.getState() ), + seed_(other.getSeed() ) + {} + + inline Squares4& operator=( Squares4 const& other) + { + if(this==&other) return *this; + + state_ = other.getState(); + seed_ = other.getSeed(); + + return *this; + } + + inline result_type operator()(void) + { + uint64_t x, y, z; + + y = x = seed_*state_ ; z = y + seed_; + + x = x*x + y; x = (x>>32) | (x<<32); /* round 1 */ + + x = x*x + z; x = (x>>32) | (x<<32); /* round 2 */ + + x = x*x + y; x = (x>>32) | (x<<32); /* round 3 */ + + ++state_; /* advance state */ + + return (x*x + z) >> 32; /* round 4 */ + + } + + inline void reset(void) { + state_ = 0; + } + + inline void discard(advance_type n){ + + state_ += n; + } + + inline seed_type getSeed() const { + return seed_; + } + + inline void setSeed(seed_type seed) { + seed_ = seed; + } + + inline state_type getState() const { + return state_; + } + + inline void setState( state_type state) { + state_ = state; + } + + inline static uint64_t generateSeed( size_t i ){ + return keys[i]; + } + + static constexpr result_type min() { return 0;} + + static constexpr result_type max() { return std::numeric_limits<result_type>::max(); } + + +private: + + state_type state_; + seed_type seed_; +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/random_iterator/detail/SquaresKeys.hpp b/random_iterator/detail/SquaresKeys.hpp new file mode 100644 index 0000000..0f4d871 --- /dev/null +++ b/random_iterator/detail/SquaresKeys.hpp @@ -0,0 +1,25057 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * SquaresKeys.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + + + +namespace random_iterator { + +namespace detail { + +/* +* +* The keys are created so that the upper 8 digits are different and also +* that the lower 8 digits are different. The lower 8 digits are created +* systematically so that all possible combinations are produced. The +* ninth digit is chosen to be different than the eighth digit. The rest +* of the upper 7 digits are chosen randomly. For any two keys produced, +* it is certain that at least one digit is different in the lower 9 +* digits. Testing has shown that this prevents similarities that can +* arise in streams produced by keys that vary only in the upper digits. +* +* Credits: Bernard Widynski in https://arxiv.org/pdf/2004.06278v2.pdf +* +*/ + +static uint64_t keys[] = { + + 0xc58efd154ce32f6d, + 0xfcbd65e54bf53ed9, + 0xea3742c76bf95d47, + 0xfb9e125878fa6cb3, + 0x1ebd294ba7fe8b31, + 0xf29ba87dc5f1a98d, + 0x815a7e4ed4e3b7f9, + 0x63acbfe213f5d867, + 0x67e2d1b542f9e6d3, + 0x682ec13872ecf651, + 0x912f87476ecf14ad, + 0x3cd7581a9de3542b, + 0x548c9decbce65297, + 0x49b37fddcad971f3, + 0x52413dcfe7db8f61, + 0xbf785e3215ac7ebd, + 0x6be5329546e1ad3b, + 0x8b7ef19654e3dca7, + 0x91d763c983d7eb15, + 0x3284b1c872d9fa81, + 0x2af83db87fab18ed, + 0xb185f4cbadcf285b, + 0x53d684c1fbd246c7, + 0x235fda821cd68735, + 0xfd7915843bd985a1, + 0x76f9c4b657cb941f, + 0x19f3e5b765cea27b, + 0xaf6235ea95b2c1e7, + 0x9d827c5ba2b3df45, + 0x8a149e2dc2a6feb1, + 0xa9d234bdcea91d2f, + 0xab34cd621f9c2d8b, + 0x65c348e32c9e3bf7, + 0x7e93bdc54dc26b75, + 0x4b37a2976ab579d1, + 0xf28b71eba6b7984f, + 0x4b2596aed48c96ab, + 0x39a5fc8ed4aec629, + 0x729c8ab1f3b1e495, + 0xb6e4a37323a5e4f1, + 0x6ac4b21652b8136f, + 0xaf89ed465f8932db, + 0xbcae59887ead5149, + 0xd3bec9487b8e4fa5, + 0xbad24f5dcba48e13, + 0xfeca932ed6948c7f, + 0x8ab14351f4768aeb, + 0x8fa96252147acb59, + 0xb479ef53237ed9c5, + 0x69581da875a1f943, + 0x72ae6d4982a4179f, + 0xd5b9184baf98371d, + 0x32dab6fdce8b3579, + 0x12bc48fedb8c64e5, + 0xa763b59feb9f8463, + 0x9d3fe4521a7382bf, + 0x7acf9b254986a13d, + 0x7f482bd43456bf89, + 0x5acef6487369bdf5, + 0x8af4673a926ced73, + 0x2bc59e6ba3721bcf, + 0x9b8a23ddcf752b4d, + 0x71d69231fe563ab9, + 0x8ec74d321e6b5a27, + 0x6cf18d432c5d6893, + 0xa1c6b984394d76ef, + 0xd41735298972a56d, + 0xd6187e9ba765b4d9, + 0x63547dbdc569d347, + 0xf846e95ed46ae2b3, + 0xa84dc2bfe47df231, + 0x89f6da365472318d, + 0x4ea36b932d543fe9, + 0x17fd98a76d384e57, + 0x63f52c987b496dc3, + 0xe874dcba9a5d8c41, + 0xd7e4f9ccb63f7a9d, + 0x5fa74d6fe753c91b, + 0x783c12e1f534d987, + 0xe7c435b21548d7e3, + 0xc128ab66534bf761, + 0xaec842f8724e15bd, + 0x176f8e4a9f61453b, + 0xc48512fcbe2453a7, + 0x6b2a87fdcd498315, + 0x593674ffec4b9281, + 0x5d7f912fe62a7fcd, + 0x9adb3652172f9e4b, + 0xc71f35e54632cdb7, + 0xd2eca7598736ec25, + 0xeb6a51298437fb91, + 0x635c9b49823a19fd, + 0xcd82715baf1e296b, + 0x924e7afdce2148d7, + 0xd5b836c1fd137845, + 0xfb6da2843d2786b1, + 0xa38dbf654b1a952f, + 0x2cb1d736571da38b, + 0x59b3ecf9861eb2f7, + 0x35e297ccb823e175, + 0x847f3c6ba425efc1, + 0xe398fdbdc4281e3f, + 0xa5d3fe4dcdf82e9b, + 0xfdc145332efc4d19, + 0xc8947ae32bef4c85, + 0xea1479f65bf37ae1, + 0xa4efd3576ae4895f, + 0xcb296a7985f697cb, + 0x738c1b6ba5fbc739, + 0x35a6921cb3fed6a5, + 0xb31528eed5e2f613, + 0x965bc7e323e5147f, + 0x8cbf97a651f723eb, + 0x872b1a476feb4259, + 0xc951deb87bed61c5, + 0xfa23b9e98ace7f23, + 0x4d972b1ba9c27d8f, + 0xf4296b1ba6d48cfb, + 0x4c7931a1f4e7bc69, + 0xdb4637f214e9cad5, + 0xdb31c5a324cdea53, + 0x1aeb345764d218af, + 0xbd6aefca91e5382d, + 0x412c9b8bafd73689, + 0xd6578baa9dca46f5, + 0xc32198dfebcd8573, + 0x8a2c6f5ed8ae73cf, + 0x9d8c457219c3a24d, + 0x52f18cd437d5c1b9, + 0x8eb72d5545b8cf17, + 0xcfeb218764bade83, + 0xbca193f7628aebdf, + 0x4ec597dba3b12c5d, + 0x4cf172eedfa43bc9, + 0xd9a614e1fec85b37, + 0x9523c4b21ecb69a3, + 0x398bec154cbd8921, + 0xe62fd8a438af967d, + 0xe7abf3c767a2b5e9, + 0xe9521c3ba8b6d457, + 0x31a5fe6cb5a8e4c3, + 0x5ce34b9ed5abf341, + 0xdaeb2391f3ae129d, + 0x59e3ab2764c3521b, + 0xba1c6e532ea34f67, + 0x6fb127854c976ed3, + 0x57e82a976c9a8d51, + 0x4dba9fe6586c7bad, + 0xfd62e85dc67f9a2b, + 0x129c348fe582da97, + 0xfb85d3cfe495d8f3, + 0xae17f8b324a9f871, + 0x687c23b5438a16cd, + 0xe48a26d8719e264b, + 0xcb24e1998f9154b7, + 0xa5e6c32cbea68425, + 0x46d1e9adcda78391, + 0xde6821fdca6981fd, + 0x78ba1d3fe76c9f5b, + 0xfde38452165faec7, + 0xb73a96d54782ed35, + 0x384ca5776475fca1, + 0xc1643d7a94782b1f, + 0xea1b52da916c2a7b, + 0x4ce23b5baf5d39e7, + 0x7cb82eaede817965, + 0xab637dc1fd6487c1, + 0xfce8da921c57963f, + 0xb83a69132c58a49b, + 0x6a92ef86586dc419, + 0x637a8f4a976fd285, + 0xb2163ceba674f2e1, + 0x4f9853ddc487215f, + 0xa432f17ed1572fab, + 0x361afe5edf5b4e29, + 0xd63948f21f3e4d95, + 0x368fb5e54d527bf1, + 0x6e2438165c438a6f, + 0x1c8df9776a3598db, + 0xef43159cb73ac849, + 0x52e6814ba63cd7b5, + 0xf5b7639dc65fe723, + 0xb72f4c8fe463158f, + 0xaf384952135624fb, + 0xab2591f8715a4369, + 0xa8132fb87f3b62d5, + 0xc12d5aea9d4e8153, + 0xeb364c598b317e9f, + 0xe51c628cba349e1d, + 0x257bf19fe825bd79, + 0xea8c6391f628cbe5, + 0x253e9b82172ceb63, + 0xe8276ab4342de8bf, + 0x1efc56d98654293d, + 0x4ca7512cb12537a9, + 0x2de7ca1cbf2a5817, + 0xfc431a2cbe1c7683, + 0xe124c39cba1c74df, + 0x3ba281d1fb21a35d, + 0xf69b57243a14b2c9, + 0x7298a6365a28d137, + 0x3b4987665618df93, + 0x95c4b8e76419dcef, + 0xd8ea12fa942f1e6d, + 0x93cfd65cb4123cd9, + 0xa34f8e9cbef35c47, + 0xb53d64ffedf76ab3, + 0x64e753832dfb8a31, + 0x83c51d432afc978d, + 0x4bf7829437dea6f9, + 0x791ed52989f2d567, + 0xc73ef4aa97f6e5d3, + 0xe94f2a6cb6e9f451, + 0x7e381b4dc4fb13ad, + 0xc1294afed1fe432b, + 0xb2d59a7543f25197, + 0xf3e9b8532dc46fe3, + 0xa275cf354cd78e61, + 0xec8b3a7549e87cbd, + 0xf3e4bd2767ed9c3b, + 0x47d926a985dfcba7, + 0x3e4618adc7d3ea15, + 0xf7291c3fe4d5f981, + 0x91c53af324c817ed, + 0x956d273543ec275b, + 0xae54193761de35c7, + 0xe2c5a1da9fd18635, + 0x3167ecfa9ed584a1, + 0xf89d531babc7931f, + 0x657afdcfe8d9a17b, + 0xb15a2fcfe59bafd7, + 0x7d54b28217afce45, + 0x28d61bf546a3fdb1, + 0x8fd1b34875b61c2f, + 0x2da37ec763d72c8b, + 0xc23e9a7981cb3af7, + 0x87dbfa4a9fbe4a75, + 0xd34b259dceb278d1, + 0x8643a5cfecb3974f, + 0xe5d3a8721dc695ab, + 0xef7cd65438bac529, + 0x71fd2b6547acd395, + 0xc2e84a68769ed3f1, + 0x5bc38e6ba7b4126f, + 0xa5b67e4dc4a631db, + 0x9ac8526ed1b84f39, + 0x51a4e6bedf8b4ea5, + 0x34d86eb32f9e7d13, + 0x6958ebf43d918b7f, + 0xbcadf2954c7389eb, + 0xe527f3b54b86ca59, + 0x71bfd98ba679d8c5, + 0x1d93c26cb69ce843, + 0xfa45e9dcb37de59f, + 0x7d8b6531f5a4361d, + 0x7bfd654212b63479, + 0x857bc2f541a963e5, + 0x8f6e21465f9c8263, + 0x2ad3ce765c6d71bf, + 0x2e13fb698b719f2d, + 0x75962eddca63be89, + 0x968cf5eed876bcf5, + 0x5b38a711f569ec73, + 0xd6b28f72145ae9cf, + 0x1df2a8c4357f1a4d, + 0x48a13527647238b9, + 0x345fe8ccb1a65927, + 0x1e8564ccbf5a6793, + 0x17d283ca9c4a75ef, + 0xe296a41dcb5e946d, + 0x748a1651fa61b3d9, + 0xb39ad2521b85d247, + 0xd68a5ec54967e1b3, + 0xc812df965769ef21, + 0xe1d53af9845b1f7d, + 0x2d7b5e69835f2de9, + 0x5eb7683dc1824d57, + 0xa9cb375edf456bc3, + 0x87c6a511fe598b41, + 0xed89cbf21e3b789d, + 0x97becd443c4ea81b, + 0x34a96b865b41d687, + 0x41a579b98954d6e3, + 0x2a95c36cb948f561, + 0xa73f846dc65914bd, + 0x5b147f6fe56d243b, + 0xb58dc7ffe15f42a7, + 0x92873bd763748215, + 0x231875b54e358f71, + 0x2ebf7c954b267ecd, + 0xe8b423576c2a9d4b, + 0xe2d34a57682eacb7, + 0x1349e8bdc941eb25, + 0x1725ecfed734fa91, + 0xbf63852fe53618fd, + 0x4bf7e582153a286b, + 0x17c63986542c36d7, + 0xd5b27a1a912f6745, + 0x86fe754a9f2385b1, + 0x6dbf4cebad16942f, + 0x3d56fbedcd17a28b, + 0x91e382ced92ab1f7, + 0xb5a7189fe81dcf65, + 0xb3296fe54832fec1, + 0xb1c85f4768251d3f, + 0xab39512875162d9b, + 0xa613fb49852a4c19, + 0xc7419f8ba21d4b85, + 0xdc9456198cfd69e1, + 0x192f58ccbce1985f, + 0x6b5da74feaf396cb, + 0x6e3729f21bf7c639, + 0x4b3e9ac328f9d4a5, + 0xe71c345768fce513, + 0xc472593765cde27f, + 0x1385f4da96f432eb, + 0x14fd3ebdc3f74159, + 0xafe4891dc1e84fb5, + 0xd1453b2dcfdb7e23, + 0xe48c5b221ebd6c8f, + 0x4d26fe743cd18afb, + 0x95d86fa54ae3cb69, + 0xbadf35e548e6c9d5, + 0x649ecbf987dae953, + 0x95d2c6a984cbe6af, + 0x7d95286cb5cf172d, + 0xba165e71f4e23589, + 0xceb974f212d764f5, + 0x4e79bc3651ea8473, + 0x3abfe5254eba72cf, + 0x897c12e76cbe914d, + 0x3cd4851768c1bfa9, + 0x36159c4ba9b4ce17, + 0x546bea9dc7b6ed83, + 0x16ed2b9dc497eadf, + 0xcd91876326ac1b5d, + 0x9bf65e4434bf2ac9, + 0xcf7a269984d25a37, + 0xa84f7bda91d568a3, + 0xb5c364187fca9821, + 0xb492cde98eab957d, + 0x29f785ddcb8da4e9, + 0xc14bde21fab1d357, + 0xd5728fc219a5e2c3, + 0x8be3d9c659b8f241, + 0x29648ac656ba219d, + 0x3a987be7648b2ef9, + 0xbf4127ca92af3e67, + 0x4f3e6a9cb1a26cd3, + 0x47af91cedfa68c51, + 0x9d745181fe8679ad, + 0xceb963721e7ca92b, + 0xd65e1a732b6ec897, + 0xf796a2865a91d7f3, + 0x21bc7e3989a4f671, + 0x7539fc4ba69715cd, + 0xe8134afed69a254b, + 0x3c5a618fe29d43b7, + 0x98674bffe1af7325, + 0x23c7e91653b48291, + 0xefa789532c647fed, + 0x759d1bc43d679e5b, + 0xbe79df554b59adc7, + 0xac5b31f9897edc35, + 0x4b376f1dc872fba1, + 0xaf75843ed7852a1f, + 0x36d54121f486297b, + 0xf9b478d2146a38e7, + 0x6ade2cb4329d4865, + 0x149acd36528f76c1, + 0xc1e2f5798e72953f, + 0x3b7decf98e65a39b, + 0xe79ca23cbd68c319, + 0xfb51793fea6bd185, + 0x16d49f7fe75bcfd1, + 0x14aec58439721e4f, + 0x9a6ed82437642eab, + 0xafbe526985674d29, + 0x9e57b349826a4c95, + 0x5e1fac2a925c6af1, + 0x932c41bbad3e796f, + 0x2d9f63edce4297db, + 0x69c34711fd35c749, + 0x48f5e9b21c38d6b5, + 0x9d1823e54a5be623, + 0xed8f3b66574ce38f, + 0x46f2edca986123fb, + 0xb19ea6ddc8754269, + 0x5461792dc34861d5, + 0x2fe9b81ed15a7f43, + 0x2179d53dce2b6d9f, + 0x85ce47f32e3f8c1d, + 0x5b9d62e54e32bc79, + 0xd8bf34776b24cae5, + 0x58d192f87b28ea63, + 0xc1be47998629e7bf, + 0x4de82f1cb74e183d, + 0x87f4c5afe74136a9, + 0x14b63da1f8345617, + 0xb256a43214297583, + 0x6bd2c316512973df, + 0xd8ce49376f1c925d, + 0xaf71bdc76d2fa1c9, + 0xb3d84a6a9b13cf27, + 0x4cfe38acba15de93, + 0x2e41bd3ba716dbef, + 0x8591d7e1f72a1c6d, + 0xb45a67e4361e2bd9, + 0x2917f3d768215b47, + 0xf5d2eba9851469b3, + 0xfe59c83cb4278931, + 0x1dceb4a65ef7968d, + 0x89e6cb487ceba5f9, + 0x4a81527cbafec467, + 0x6f2b54ddc9f1e4d3, + 0xa3bde9c32ae6f351, + 0x1e63d78548f712ad, + 0x9f72ab1767fa412b, + 0xdc71e3b764ec3f87, + 0xf9b25a7982cf5de3, + 0x9174f8acb2f38d61, + 0x6d3fca5a9fe47abd, + 0x64ab1371fde79a3b, + 0x6e4f97221debc9a7, + 0xd971a8543aced915, + 0x1c4a9b865ad2f781, + 0xda1b53f878c416ed, + 0x4c16fd8ba7e8265b, + 0x7f8a3e6cb5ea34c7, + 0xe47516adc2ed7435, + 0xa8c52fdfe2df73a1, + 0xa6f1943653d4921f, + 0x5b6df4732ec49f6b, + 0xf2a154643cb6aed7, + 0xf9a1ecb769bacd45, + 0x743b18f7679decb1, + 0x92168deba8c31b2f, + 0x65db129fe6d42a8b, + 0x3c7264ffe4c639f7, + 0x9ebf384213db4975, + 0x1ecb836543bc67d1, + 0x6b24d8c651be864f, + 0x518947a76fc294ab, + 0xfc3e6a198eb6c429, + 0x3895ec7bacb8d295, + 0x79bd84edc89ad2f1, + 0x2fe6b9ddc68bde5f, + 0x4c961af437912fcb, + 0x96f17e8327b54e39, + 0x1be795c763b74da5, + 0x4c9d253984ba7c13, + 0x7db136c9819c6a7f, + 0x8edac12a9d6f78eb, + 0x8439ab2edea2c859, + 0x47a21691fb94d7c5, + 0x9cd7b3821ca9e743, + 0xcda1e5b3287ae49f, + 0xd8ae3bc7689e251d, + 0x8dc1742ba8b14379, + 0x42f76d5cb7a462e5, + 0x4a98165ed4b98163, + 0x415fe36dc1786eaf, + 0x5f2de79dcf6b8e2d, + 0xa8f756321e5fad89, + 0x91f5de843d72cbf5, + 0xce21f5354c85eb73, + 0x5cbe3a654956e8cf, + 0xc4df7e2ba87b194d, + 0x1f82ba9dc56e27b9, + 0x1cf4a83fe6a15827, + 0x2e459b31f2a47693, + 0x57d84ca2128674ef, + 0x1cd538a5417a936d, + 0xf8b539a54f5ca2d9, + 0x4b762d998d6fc147, + 0x65c439f98b62dfa3, + 0x7183a2ccba76fe21, + 0xa39f5d1dc9581e7d, + 0xa3d8ce21f65a2ce9, + 0xf9bca622186e3c57, + 0xbfa7ed2545716ac3, + 0xdc4e672a93758a41, + 0x4d35b9fba145879d, + 0x46e59cb98f49a71b, + 0x23de976bae3dc587, + 0x5f6ec73cba4fc5e3, + 0x3c814a6feb73f461, + 0xb7d4f8c32a5613bd, + 0xbe769c465a69423b, + 0xebd41a97685c41a7, + 0x54be1a79864c5ef3, + 0xc348fa5cb4528e71, + 0x23e7984ba1437bcd, + 0xfa5cb87edf269c4b, + 0x5b497311fe28cab7, + 0xd638bca21e3cda25, + 0xf281bdc54b3fe891, + 0x81cb9a776a4317fd, + 0xbe43f2da9a35276b, + 0x47a1982cb82935d7, + 0x9a5e832ed82c7645, + 0xa26e17ced53e74b1, + 0x8acd63ffe451932f, + 0x139a2f665234a18b, + 0xb4e5c1f43d15afe7, + 0xc692b5354d19ce65, + 0xf18e42b7692aedc1, + 0x9be6d458781deb3f, + 0x26435afed8132c9b, + 0xcdba26ffe8264b19, + 0x1c5724b1f6194a85, + 0xa46178b4352b68e1, + 0x7aefcb95431d875f, + 0xb46c89e8732195cb, + 0xc2d63a987ef2c539, + 0x2e675d198cf6d3a5, + 0xbfe6928babf9e413, + 0x3f8c4a1cb8dae17f, + 0x892e4b5dc7fd21eb, + 0xf36ab95328e13f49, + 0xabc1589327f34eb5, + 0xec1d4f3765f87d23, + 0x68a432f652e96b8f, + 0xd57c2ba761ec79fb, + 0x3b9d8a687edfba69, + 0x83d746bbabe2c8d5, + 0x5b97d621fbd6e853, + 0x9258d7c219c7e5af, + 0x21fda79549eb162d, + 0xb49a18d657de2489, + 0x5d4f6bca98d163f5, + 0x4efd126cb6e58273, + 0x71f8935ba3d671cf, + 0xe71c894cb1c98f3d, + 0xe9f85b3edfbc8ea9, + 0xfc173d632eafbd17, + 0xf9316ba54db2ec83, + 0x2db7c98438a4e9df, + 0xc79b23e769c81a5d, + 0xd15b96c876db28c9, + 0x31ca824cb6ce4937, + 0x3a624d8fe5d167a3, + 0xca42d6e1f4d59721, + 0xabf4563212c6947d, + 0x12d5c9a541c8a3e9, + 0x38eb96554fadc257, + 0x7c3b81276b9fd1c3, + 0x2fe9c5798ba4ef31, + 0xe8691c7cb9a51f8d, + 0x48bda12dc6a72df9, + 0x6c94b281f5ab3d67, + 0xa38d2b92169e5bd3, + 0x519b6ad546c28b51, + 0xb73edf6652b378ad, + 0x251e3f9871c6a82b, + 0x376eb2c65f8ac697, + 0x81fc2a3a9d8bc6f3, + 0x3fa9126dcb9fe571, + 0x1d4ec5b1fa9314cd, + 0x9ba36d521ca7234b, + 0x42fec1a438a942b7, + 0x1d9a2e8768ac7125, + 0xa9584128749d6f81, + 0x3c6bef4a93817ced, + 0x7eab124dc1839d5b, + 0x87eb125edf65abc7, + 0xec31b8d1fe79db35, + 0xdab537e32d6ce9a1, + 0xba712cd43a6de81f, + 0x7fd93b665c93287b, + 0xdbf932a98a9536e7, + 0x54bae38dc89a4765, + 0x41c685bed48b75c1, + 0xe8132f5dc27d843f, + 0xe68d31c1f371a29b, + 0x2e1b9c654385c219, + 0x3ceab1d32e46cf75, + 0xd9e381b54b58ced1, + 0x29d3c5a7695aec4f, + 0x254fa8c8785f1dab, + 0x6c254e7eda734c29, + 0x7cf56b9fe8764b95, + 0x532d9f8fe45869f1, + 0x85679422134b786f, + 0x8b415f24324e86db, + 0xa3d5f4298271c649, + 0x4791afd98f63d4b5, + 0xd2e3cbfbad68e523, + 0xf173c62bab49e28f, + 0xc58ef37ed95c12fb, + 0xcf89342fea5f3169, + 0xbd957f3219624fc5, + 0x37e1b6c329567e43, + 0xce41f72654376c9f, + 0x6ef4ba98734a8b1d, + 0x13bc7529813eab79, + 0x6cdb9f2baf31c9e5, + 0x52a498fdcd24e963, + 0xca73f62eda25e6bf, + 0xb4c73a932c4a173d, + 0x1bd293554b3d25a9, + 0xc9ebf5398a3f4517, + 0x3762e14cba527483, + 0xe4c87f9ba63572df, + 0xf265149dc438915d, + 0xa5418fced12a8fb9, + 0xe12ad8bdcf1dbe27, + 0x2b15cd754f21ed93, + 0xdcab68354b13daef, + 0xa6c942165c271b6d, + 0x8a5234f76b182ad9, + 0xc29af5dcb91d3a47, + 0xf4e3ab5dc71f58b3, + 0x4c73f2bfe7249831, + 0x59c1ab61f314958d, + 0xc8435d632317a4f9, + 0x34cde9a6521bc367, + 0xbe9376865efbc2d3, + 0x2b4c5df87bdfe251, + 0x9a4b76c98bf421ad, + 0x63c9df4ba9e63f1b, + 0x2674539dc6f93e87, + 0x627581fed6fa5ce3, + 0x93c54e8325fe7c61, + 0x7e49586434f179bd, + 0x1c98b27762f4a93b, + 0x9afc283761f5c8a7, + 0xd4592fa87fead815, + 0x34b6a7da9bdce681, + 0xbcd386fa98acf4ed, + 0x84651ab1fae3245b, + 0x84ab36221ae643c7, + 0x3ac625d549ea7235, + 0xbf9ce8a656ec72a1, + 0xc69ae34653ab6efd, + 0x4ecad75983d19e6b, + 0xd71a62fa91e3acd7, + 0xbfc94d5bafb7dc45, + 0x6e78c5b1fdc8eab1, + 0xa4cdb7921cabe92f, + 0xc8b2df543acf198b, + 0x2ab986e65ac238f7, + 0xae6c3bfa9ad64875, + 0x1c4f298ba5c976d1, + 0xcbf8371ba3cb854f, + 0x5aeb9c3ed2ce83ab, + 0x94625be1f4d1c329, + 0x6bf9471432c4d195, + 0x1d9528f43d96cfe1, + 0xefa49dc43b98ed5f, + 0xac27f3d6598a1ecb, + 0x15e6ca8878af2d39, + 0x89c2ab5ed8b24ca5, + 0xbfd5219fe8c67b13, + 0x61d725cfe3b8697f, + 0x75bce8f2139a87eb, + 0x6d5412b432aeb759, + 0x849e625872a1d6c5, + 0xa62db4e98fa5e643, + 0x68d3ac487c86e39f, + 0xefa743ccbc9a241d, + 0x6c294adfebad3279, + 0x142957bed89f41e5, + 0xf796bec219a27f53, + 0xfb35d6e325846daf, + 0xcf76a3d654978c2d, + 0x2e7b6cd6526bac89, + 0x4b2619d9817dbaf5, + 0x3784a96cbf81ea73, + 0xdc269b1bab63e7cf, + 0x64a79211fc97184d, + 0xc26e37f21d7a26b9, + 0x7ba64f943b9d4627, + 0xa3be9f254a8f6593, + 0x4e3a821a968273ef, + 0x26cf391cb485926d, + 0xd571863dc367a1d9, + 0x163c8abed16abf37, + 0x58ac2d4cbf5dcea3, + 0xfd9782654e73fd21, + 0x5e6417843e641c7d, + 0xe625b8a54c562be9, + 0xb39c74598c6a3b57, + 0xf372c6dba86d59c3, + 0xa6145dedc86f7941, + 0x5b81d9afe452869d, + 0x4dcb5e71f375a61b, + 0x7b5af4e21259c487, + 0xd3a21e76516ac4e3, + 0x9dbe5c387f5de361, + 0x27eb4d598e6312bd, + 0xd2635c4bad76413b, + 0x6f539e4dcb463f97, + 0x2156d4adc8495df3, + 0xed9a5341f84c6d71, + 0x4576b8e2153f6acd, + 0x8562d4f436529a4b, + 0x7adb94876234c9b7, + 0x762bc39ba148d925, + 0xb93fea598f3be791, + 0x4cab7d298a2be5fd, + 0x1f53c49fed41256b, + 0x3a6c5d11fb2534d7, + 0xbef52a321c297345, + 0x8f2d3ac6594a73b1, + 0xe18c9457674c812f, + 0x92acd417642e8f7b, + 0xe2f1b3aa9432ade7, + 0x7c3d48ecb124cd65, + 0xf632541baf27ebc1, + 0xc658e2bedc19ea3f, + 0xe8d52f943d2e1a9b, + 0xfab958276d324a19, + 0x824c5af87c134985, + 0xfba4d85a9a2867e1, + 0xd7e5a81cb71a865f, + 0x1d9463cba51d84cb, + 0x36792fced51fb439, + 0xb8ae97d1f413d2a5, + 0xaedcb9176547e213, + 0xf84ecd632bc5de6f, + 0x2a9fe5754ae81fdb, + 0x9327cad76afc2e49, + 0x3fa6cb8878ef3db5, + 0x9fd674ecb9f47c23, + 0x5f7836bdc5e46a8f, + 0x12f7b95ed3e678fb, + 0x4a267e3213fcb869, + 0x8921fa7432feb7d5, + 0x9fae754982f1e753, + 0x5ef2c4976dc3e4af, + 0x62f51a7a9ce8152d, + 0x849732fbaceb2389, + 0xf26c5a3cb9dc42f5, + 0xa75b64dfe9df6173, + 0xbefa682217c26ebf, + 0xc74b56e326c58e3d, + 0x35d97f2543e68da9, + 0x9eacbf3763eabc17, + 0x265a49d871cedb83, + 0x65db3c187ca1e8df, + 0x5e1d297cbec4195d, + 0x65ac8ed1fbd627c9, + 0xcafd3be21cdb4837, + 0xa4ed1b9329cd56a3, + 0x6b814d7659cf8621, + 0xd41efab986c2937d, + 0x21796b3984c5a2e9, + 0x6df7a15cb3d9c157, + 0xf8ce714ed1a9cfb3, + 0xd4e2568cbf9cde31, + 0xbe149fa43fa21e8d, + 0x478d9f543da42cf9, + 0xd3a58c154db83c67, + 0x91f5cd7768b95ad3, + 0x7f352a6a98bd7a51, + 0x375cf19cb49f67ad, + 0x15289f6fe5c3a72b, + 0xe2964dc1f2b4c597, + 0x2659e3c212a8c5f3, + 0xc46bf9a652abe471, + 0x265b8e354e7bf2cd, + 0x167243c98ea1324b, + 0x53e6da7a9da541b7, + 0x5f169e4dcba86f15, + 0xe98ac1fed79a6e81, + 0x8ca2b911f47a6bed, + 0x8a2d9c42147f8c5b, + 0x745bafc43482bac7, + 0x6329c4d87296da35, + 0xbfa439776297e8a1, + 0xdefab1c98d6ae71f, + 0xf16492bbad8e167b, + 0xa86f597edc9135e7, + 0xd3b8ca41fca37465, + 0x3e184dc32b9874c1, + 0xc8659215497a823f, + 0x73fd52c5456d819b, + 0xa2478937635d9ef7, + 0x795bd13ba382ce75, + 0x1498635ba275ecd1, + 0x479265ebad57eb4f, + 0x2d19a871fe591cab, + 0xf58ec9321d6e3b29, + 0xc7adb2f43d714a95, + 0x4befda665b7468f1, + 0xc5ad813a9a45876f, + 0x34c6951ba64985db, + 0x79e531adc36db549, + 0xa1ef728ed26fc3b5, + 0x57e86491f185e423, + 0xd7a582443265e18f, + 0x3daf9c854e5821fb, + 0x513a47c76d4b2f59, + 0x542f36b87a4d3ec5, + 0x15d876fbab617d43, + 0xdb32e69dc8436b9f, + 0xa8dcbf5fe7468a1d, + 0x8a6931d1f438ba79, + 0xc3e869f2143cb8e5, + 0xba6287d6524fd863, + 0x4e915ab87142e5bf, + 0xce2f176a9f47163d, + 0x97ef8c6cbe3824a9, + 0x34a7d1ecbd3c5417, + 0xea2b8f9edb4e6283, + 0xd98c7f1fe94271df, + 0xcbe7d8f219238f4d, + 0xaf2edcb436258eb9, + 0xbf5ed7176539bd27, + 0x5a824b98742bdc93, + 0x3a986b18712dc9ef, + 0x43e6829cbf231a6d, + 0xe86b145dce1528d9, + 0xba2e8741fd1a3947, + 0x51dc67432d1c57b3, + 0xb63a92e65b2e8731, + 0x5739fac76a21948d, + 0x2c94f5b98714a3f9, + 0x875126ccb518c267, + 0x1235f46cb529c1d3, + 0x78a4bf2dc32bdf41, + 0xb54da2e98acbfe9d, + 0x9bf361254df23e1b, + 0xbef1a4d32cf43d87, + 0x516879e54af75be3, + 0xce28f3a659fa7b61, + 0x596c13d875fc68bd, + 0xefd8273ba5ef983b, + 0xf578219ed4f2c6a7, + 0x6159fb7fe3f6d715, + 0x3e97416323f9e581, + 0x6759c3b541c9f3ed, + 0x739ca1576fde135b, + 0x7129d5e98de142c7, + 0x168dcbfbace67135, + 0x978ca23cbad76f91, + 0x28c579eba5b86cfd, + 0x493ba581f4ec8d6b, + 0xf5732a6214cf9bd7, + 0x4fb6752436e2db45, + 0x4e1ac8d763d5e9b1, + 0x13d8acf761c7e82f, + 0xdf82ba976fdc178b, + 0x5436fe8a9cbd26f7, + 0xf5d4c16fecd14675, + 0x65ad7e31fac475d1, + 0xad5fc6321ac7834f, + 0x1d4bfa5436d982ab, + 0x9c1de34656cdb129, + 0xf1785d2763aebf85, + 0xa61d95b984a3cde1, + 0x2b41538a91a4ec5f, + 0x19cb584baf971dcb, + 0x26ac57b1feab2c39, + 0x692bed821d9e3ba5, + 0xe69d1a765dc27a13, + 0x96da5bc54ab3687f, + 0x3c981f7547a586eb, + 0xf59b641984cab659, + 0x489257eba39db4c5, + 0xa21d834dc2afd543, + 0x64b2e9aed1a3e29f, + 0xace671b654b7231d, + 0xc67df8e54fba3179, + 0x3bcd6e954c8a3fd5, + 0x89a5db687b9d6e53, + 0x98fc31a879816caf, + 0x285174bdc7948b2d, + 0x61fcd27fe475ab89, + 0xac3bd79fe378b9f5, + 0xf73bac22148cd973, + 0x4fb57c84327ed6cf, + 0xa2351cd982a3174d, + 0x1af8e4c87f8625b9, + 0x923d845cbe9a4527, + 0xcd49736cbd8c6493, + 0xa26e4f7cb97c62ef, + 0x1e854a71fa82916d, + 0x67f83d4217638fc9, + 0x6e1bc4a32586be37, + 0x8ae239665468cda3, + 0x76f12db9847bec21, + 0x5fde6919815efa7d, + 0x5a63271cbf632ae9, + 0x817c54bede863a57, + 0xec986521fd6958c3, + 0xfc819a732d6c7841, + 0xb597f8c32a4e759d, + 0x95184c776972a51b, + 0x5e92461ba964c387, + 0x4de71b6ba567c2e3, + 0x2e5d9fadc47ae261, + 0x75e934acb149efad, + 0x149d8eadcd5e1f2b, + 0x432bd5e21f523e97, + 0x9a58b4632d465cf3, + 0x7baf82d65d496c71, + 0xe6f83c46583a69cd, + 0x2dfe538ba73e894b, + 0x587a2fbed641c8b7, + 0xcfdba72fe764d825, + 0x39b6c151f347e691, + 0x2ec67f321238e4fd, + 0xdce458b8725d146b, + 0xafbc24e76e4f23d7, + 0x2b83fe5bae637245, + 0xe7b13c2bad4672b1, + 0x97f1a63cba387e1f, + 0x29e7846ed62a8e7b, + 0xa3479be1f52d9ce7, + 0x467fda932831dc65, + 0x7ca41fd65634eac1, + 0xf3dba5287426e93f, + 0xda6c8f98723a189b, + 0x7c9fb82baf2d3819, + 0xfe12468cbd1f3785, + 0xef24c9bedc2376e1, + 0x4951db8feb16845f, + 0xa9b1c8e32a1783cb, + 0xc9124d66581cb239, + 0x4f253c77672ec1a5, + 0x5bf2ac998632cef1, + 0x13f56dba9413ed6f, + 0xf17e8b3ba3261edb, + 0x5c27f68cbef82d49, + 0x3f5a612fedfa3cb5, + 0x5b2ca8421cfe6b23, + 0x62d5fe143be1698f, + 0x81fc9ed549e387fb, + 0x9e1dfa2548f5b769, + 0x4963edc984f9b6d5, + 0xe98c2dbba4fcd653, + 0xbae831ca92ced3af, + 0x1ac2f39fe3f5142d, + 0x3cae279541f63289, + 0x7e5c4ba43ed941f5, + 0xda13b2e54cdb5f63, + 0xd68cb59548ac5dbf, + 0xe59cda8879e18c3d, + 0x8493d71cb6e38ca9, + 0xe3b92fced5e6cb17, + 0xe3b2ac51f4e9da83, + 0x9be2745213bac7df, + 0x6b4ac5e432bef75d, + 0x4f36e2b871e326c9, + 0x21de38ba9fd84637, + 0xda96efb98ed965a3, + 0xc81be73babdc8521, + 0xf17ba62dc9be827d, + 0x5e29d4c1f7c2a1e9, + 0x7c5b6a3218c3bf47, + 0x3acf915325a6ceb3, + 0x1a295fb765b9ed31, + 0x2ed38746529afb8d, + 0x836e954872ae1bf9, + 0x3d478bebafc23b67, + 0x31fa65edceb659d3, + 0x28ec75b1fdca7951, + 0x625879c21c9b76ad, + 0xd27fc4b438ae962b, + 0x6fa4192658b1c497, + 0xb753cae987a5c4f3, + 0x94bf178ba5b8e371, + 0xcd478fbba398f1cd, + 0x67bca52fe3ad214b, + 0x581eadfdcd8e2fa7, + 0x1ecf6b932fa36e15, + 0xc2f765843ea56d81, + 0x148dab543b876aed, + 0x912d8e75497c8a5b, + 0x42731ed9856ea9c7, + 0xa5e2b46dc7a1d935, + 0x59f64b8ed594e7a1, + 0xfb8ea53ed397e61f, + 0x8743fea3239a157b, + 0xafcb31e6519c24e7, + 0xdeba41987e9f4365, + 0x75269bd98e9473c1, + 0xf5ec319bac96813f, + 0xfd1b52adca567f8b, + 0x2da9b8edc65a9df7, + 0xcb817261f46ebd75, + 0x67cb48943672ebd1, + 0xa614dbe32573ea4f, + 0xa46b3fe6537619ab, + 0xa264b979817b3a29, + 0x72f9e53baf6d3895, + 0xf69d783bac6e57f1, + 0x8aeb35cedc72856f, + 0xde9cba11fa6584db, + 0x9a2d6b521c68b349, + 0xef698db4386ac2b5, + 0x148e2da7687ed123, + 0x94fde1598451de7f, + 0xc27d41aa93641feb, + 0x3bf7a56dc1672e59, + 0xd6c5fe2cbf493dc5, + 0xbc1952e1fe5d6c43, + 0x35cbef921c3e5a9f, + 0x2a8e9b354c53891d, + 0x34eba2f65c34b879, + 0x2cf974576938b7e5, + 0x3f18d47ba84bd763, + 0x3b67ecfa953cd4bf, + 0x67dc291fe672153d, + 0xa75b18e1f16523a9, + 0x3ca8fbd542695317, + 0xbc9fed365f4b6183, + 0x71cdb9854b2a5ecf, + 0x312d47e76a2f7e4d, + 0x29cb1f687a328db9, + 0xc1a462fed935bc27, + 0x64718b2fe627db93, + 0x78293baed429c8ef, + 0x6cb79fe2142cf86d, + 0x89d7b5a7654127d9, + 0x13f8749ba1253847, + 0x2d47853a9f1856b3, + 0x4efdc81bae2b8631, + 0xf35d91bbab1c738d, + 0x124f3a6dca1e82f9, + 0x5b397c61fa23c167, + 0x791cb8d32815bfc3, + 0xfa893b165728de41, + 0xb16a98e65418fc9d, + 0xb9d7e619853e2d1b, + 0xed3f4c7cb4213c87, + 0x3a81652a9df25ae3, + 0x73a12f5dcdf57a61, + 0x4bfd396feaf867bd, + 0xc6d394521afc973b, + 0x5ce1d68328feb5a7, + 0x13eca9f879f2d615, + 0x68bd321a97f5e481, + 0xc65d3f7984c6f2ed, + 0x2d5e691dc4fa125b, + 0x5c72e64cb2fd31c7, + 0xec62a98cbdce4f25, + 0x7158b4e32fd36e91, + 0xed3f5b432ac46bfd, + 0x1abdf6943ae78c6b, + 0x7d51fb2546eb9ad7, + 0xd71f9c5987deca45, + 0x9d43156ba6d2e8b1, + 0x48af192cb5c4e72f, + 0xd5b2e7a1f3e7168b, + 0x729cd64213da25f7, + 0x8dac9e7761ed3475, + 0x38f2ea965ebf64d1, + 0x694128587dc3824f, + 0x3c2b6ad87cd581ab, + 0xf42dec5cb8c7af19, + 0x76913cbed6cabe85, + 0xe793b8d1f59dbce1, + 0xf136ead326a1eb5f, + 0xa82e5f6435d41acb, + 0x49dcfea764d72b39, + 0x396be2c871db39a5, + 0xb19c27698fbd6913, + 0x5dce63aa9cae567f, + 0x29f8531edca285eb, + 0x6bd852a1fac6b459, + 0xbc4d897219a8b3c5, + 0x679d342658abd243, + 0xd2b85fe5458cd19f, + 0x36eba41a97b4321d, + 0xdc4b8f5ba3b42f69, + 0x3cf1e5dcb1a73ed5, + 0x92e685bdcf9a6d53, + 0xb726ad9fed7c5baf, + 0x6e8dac421c8f7a2d, + 0xd491ec543d72ba89, + 0x9f4e8ca43a94b8f5, + 0x1fa2476656a9d873, + 0xba316ec98479d5cf, + 0xb6129d8ba38cf54d, + 0x54cb391fe5a124b9, + 0x8b617931f1b65427, + 0xd6b8c12541b86293, + 0x89cb21743d7961ef, + 0xca56e2f43c6b7f5d, + 0xb823a1d54a5f7ec9, + 0x6fac481a9a82bd37, + 0xad6f317cb875dca3, + 0x26451e8ed678eb21, + 0x6afb1d9fe35af97d, + 0xf3785cb3246d18e9, + 0xc743bd2764a13957, + 0xf1e7b249819457c3, + 0x1b829e7baf698741, + 0x7edc26198e5a749d, + 0xdbc9518bac6d941b, + 0x96752c4eda5fb287, + 0x28d34ac1f974c1e3, + 0x51a93fb32976df51, + 0xba1463832546fead, + 0xfdeb5468756a1e2b, + 0x7fe3dc69835e2d97, + 0xe6c4f21ba2715bf3, + 0xd86e529dcf546b71, + 0xcd6794acbe3568cd, + 0xb9738641fd3a984b, + 0x4d75e8f21c3da6b7, + 0x1acd69443a4fc725, + 0x4285ac687a63e591, + 0x1a7629498745e3fd, + 0x3b98de2dc759136b, + 0x8a459fddc45b32d7, + 0xc8524b7ed27e6145, + 0x8a6e734ede426fa1, + 0xcfb79ed32e347d1f, + 0xabe2cd743e258d7b, + 0x9ced3a154c289be7, + 0xc9632ab8792dcb65, + 0xa5d6c719873fd9c1, + 0xc1f5e67cb742e83f, + 0xa3986b2fe635179b, + 0x4b8a19d1f54a3719, + 0xafd34722142c3685, + 0x394d6fc8723d65e1, + 0x8d41ec687e21835f, + 0xdba62ef87e1482cb, + 0x8647f3dbad27b139, + 0x7f481d5dca18bf95, + 0x83f724ddc72abdf1, + 0xd7145f3cb51edc6f, + 0x1ac8269547231cdb, + 0xe3cb6d1657162c49, + 0xf24bd31874183ab5, + 0x7d3ab62a941c6a23, + 0xbc5432d76dec578f, + 0xdc6a51f98ade76fb, + 0xf25b4c6edcf2b569, + 0xa6278d3fe9f6b4d5, + 0xc5d746921af9d453, + 0x571bed4436e9d2af, + 0xf1bcd49656ecf12d, + 0xdce4528ba6f23189, + 0xe8a4163a92d43fe5, + 0x12dc689cb1f85e63, + 0x82573a6a9ed85cbf, + 0x25d83641faec7b3d, + 0xa5fe36b21cdf7ba9, + 0x92fe78554be3ca17, + 0x96eb73c54ae5d983, + 0xe87f591545b7c6df, + 0x4963c51984caf65d, + 0x69edb12ba4de15c9, + 0x6b42198ed6e14537, + 0x9a825b41f1e564a3, + 0x3f7d841653e98421, + 0x89c761443fca817d, + 0x2614d9c43cab7fd9, + 0x741d6ba659bfae47, + 0x54fa36d878a2cdb3, + 0xe2d315fba8b6ec31, + 0x92d57badc4b6fa8d, + 0x1ba5936fe4cb1af9, + 0x8d6eb34214ce2a67, + 0xb1329e4764c158d3, + 0xb836de1a92d47851, + 0x72b819c54fb675ad, + 0xa821bd987eca952b, + 0xc65d7f298cadb397, + 0x4a6eb7ddc89eb2f3, + 0x25689c11f9b4e271, + 0x8562bac21684efbd, + 0x921eac7546a81f3b, + 0x4138e6c6549b2ea7, + 0x691e4db983ae4d15, + 0x8b2175fba3b26c81, + 0x65e72fbbaf8369ed, + 0x97b35f4edea6895b, + 0x321ce581fd69a8c7, + 0xc793afe21b9dc835, + 0xde98f6b4398fd6a1, + 0xb3a145776893e51f, + 0xc7f28e4a98a6147b, + 0x6537adccb5a923e7, + 0x35184baed3ac4265, + 0x8a5791ced39e62c1, + 0x2584d97dcd817e2f, + 0x429bf6521f637e8b, + 0x6b854ed32d659cf7, + 0x82967f443d69bc75, + 0xdb2896e6586bcad1, + 0xbe92d179876ed94f, + 0xb27fc8aed67318ab, + 0x8b97c12fe5a63829, + 0x9c7bd521f28a3795, + 0x5d76bf83238b56f1, + 0xf85e9264318d746f, + 0xe17dabf65f6183db, + 0xebdfa3998e75b249, + 0xa7de468a9d67c1b5, + 0xa31d47fcba69cf13, + 0xa2718dccb64acd7f, + 0x215dcb9ba54dfceb, + 0xca8342d218732d59, + 0xca318d4324763bc5, + 0xf196da7982796b43, + 0x56a8d9f8714b589f, + 0x4db1f63a9f4e781d, + 0x7ae3854dce41b679, + 0x5b96a7fedc43b6e5, + 0x3791c5e1fb48d563, + 0x2e5b69721948d3bf, + 0xbfc71255485bf23d, + 0x9124e787675f12a9, + 0x3e2648acb9845217, + 0x8f5491acb2465f73, + 0xd6be4c5ba1375dcf, + 0x36e541fcbf2a7c4d, + 0x493c6571fd2e7cb9, + 0x16b298443e41cb27, + 0xde3168c65c24da93, + 0x82bec7d54925c7ef, + 0xa43ed6265829f76d, + 0x6f59374ba73c16d9, + 0x4e7a8bfdc83f2647, + 0xdc72ba5fe74265b3, + 0xb342e1c1f2478531, + 0xf16289e54139728d, + 0x81b7af354e2b81f9, + 0x5eb328f54c1daf57, + 0xeb5a1c287a21bec3, + 0xc4216eda9a25ed41, + 0xd238c46ba715fb9d, + 0x152973afe7392c1b, + 0xbde16831f51d2b87, + 0x15cfd8e3261f49e3, + 0xdb4fc13985237961, + 0xfa453e19821476bd, + 0x723b16d65ef7963b, + 0x4dc1e9876df9b4a7, + 0xd51e2fba9afdc415, + 0x58da9c3cb9efd381, + 0x4c2a938cb7c3f1ed, + 0xca7d265439f7215b, + 0xf16745e435e82fb7, + 0xe9cb643876fb4e25, + 0x9fd2b45873fe5d91, + 0x5d13f27982e16afd, + 0xd2a1e47a9fe38a6b, + 0x87f9245cbce5a9d7, + 0xec6291b1fbeac945, + 0xfcab649329ecd7b1, + 0x1b68e95438bed62f, + 0xbe43da5769e3158b, + 0x42a83c1a98d624f7, + 0xfd8e672cb6ea4375, + 0xe6bc134ba4eb63d1, + 0x4ea169fcb2cd714f, + 0xe145963edec17f9b, + 0xef57c8a32fc4ae19, + 0xe5c9ab632ec6bd85, + 0xb17f6a2549a8cbe1, + 0x31286755479bda5f, + 0xa9b135f7659ef8cb, + 0x6fa93e2dc7d42a39, + 0x536981bfe4d638a5, + 0x6a5c4e31f4da6813, + 0x24cefb7212cb657f, + 0xb8259e7431ad74eb, + 0x1c3925a76fc1b359, + 0x836cadb87ea4b2c5, + 0x83fac6da9cb8d143, + 0xc6be1d4ba697ce8f, + 0x72c84bfba579edfb, + 0xa2641e9ed5af1e69, + 0xf3857b4217a23cd5, + 0xeb7d6f3324b76c53, + 0x823ce17542b759af, + 0x98a74db761ab792d, + 0x4b7982e65f6ea789, + 0xc1e685fbad91b7f5, + 0xfd237b5feca4d673, + 0x7189adffe986d4cf, + 0xca4329521a89f34d, + 0x2eb318d5478d13b9, + 0xfb3c879768af4327, + 0xc4f5321ba7b46193, + 0x1a5b7dea92845edf, + 0x79fde58cb1987e5d, + 0xe36cf2acbf5a7dc9, + 0x513b8641fd6eac37, + 0x64cedb132e71dba3, + 0xdc5163254c85ea21, + 0xe97264543a65f87d, + 0x3bd769e6586a17e9, + 0x6f4d28ecb69d2857, + 0x84ea1fdcb58f46c3, + 0xc61af7bfe5a38641, + 0xd24695a1f185739d, + 0xdb9fc5a54278931b, + 0x9f2cbe143f5cb187, + 0x5f8a76b54b5cafd3, + 0x1a63ce598b72de51, + 0x98c6ef387853fcad, + 0x72ea819dc9671d2b, + 0xd218b79fe65a2c97, + 0x512c48afe56c4af3, + 0x7fad43c3246f5a71, + 0xef89b255435267cd, + 0xda49e5198165974b, + 0x27afbce76f38a5b7, + 0xd734b65a9e4bc625, + 0xc68be5dbab5ed491, + 0x8269753cb951e2fd, + 0x7c248161fa75126b, + 0x841fdb632a5831d7, + 0x76f1c3d3286a4f35, + 0xd9a53f18764c5ea1, + 0x5f6b7ed9834e6c1f, + 0xc532fe9ba1428c7b, + 0x7429fa6cbf249ae7, + 0x1f39c42ede28ca65, + 0x4175bd81fb3ad8c1, + 0xae4f93c21a2cd73f, + 0x1b7ce4365c42169b, + 0x46357b998b453619, + 0x4a31657cba293485, + 0x623195ecb73a64e1, + 0x2587c63cb43c725f, + 0xf947ac2ed23f71cb, + 0xcfab683ede13af29, + 0x43b58e932f14be95, + 0x1ac78d954d27bcf1, + 0x8c7e25354a19db6f, + 0x3987abd6571cf9db, + 0x349bfd2dca312b49, + 0xcbf1843ed81439b5, + 0x91ca84ffe7186923, + 0x14b9735fe31a568f, + 0xc9d8ab33231c75fb, + 0xac1fd396521fa469, + 0xb3ed24a76ef1b3d5, + 0x72f351998cf6d253, + 0x3e56281879e6d1af, + 0x876e5c3a97c8ef1d, + 0xe954186cb6ec1f79, + 0x9a674e3cb6cf2de5, + 0x7f6832c218f25d63, + 0xcf67a35323e45abf, + 0x6efa319652f87a3d, + 0x293bd14651fc78a9, + 0x32cf9d876fdeb917, + 0x2583d6ebace1d783, + 0x756d32fba9b3c5df, + 0x5da329ffe9c7f45d, + 0x785dcfb328ea14c9, + 0x69db1a2659ed2437, + 0x37bd51e767df52a3, + 0x67e3b1dba7e58321, + 0x81a5f6ba92c47f6d, + 0x1e79b5dba1c67ed9, + 0xe27586ca9fcbad47, + 0x36d95c21fd9eacb3, + 0xf6c152354dc2eb31, + 0xde86b5a32ab3f98d, + 0x8f2571e54ac618f9, + 0xa6827fc658db2967, + 0x3bc7ed6a96bc47d3, + 0x8217e39cb4cf6751, + 0x38abf42fe3c274ad, + 0x9c318d71f1d6942b, + 0x8d5c24e431d8b297, + 0xd3a916254e9ab1f3, + 0x19e2dab54b9dcf61, + 0x3ef276465981febd, + 0x19c5462989a51e3b, + 0x624b9f8dc8b62da7, + 0x129fbdcfe7ba4c15, + 0xc81b2561f4ad5b81, + 0xed32ca92139f58ed, + 0x65edc78543c2985b, + 0x6c3abd4651b4a6c7, + 0xce19fda76fa9c735, + 0x3d4e81a87e8bd5a1, + 0x657cf31a9a8cd41f, + 0x2cb8163feca2137b, + 0x5b42d691f9a532e7, + 0x1fd679332ab94165, + 0x5a4cd9e436895fb1, + 0xea6fb1d6548b6d2f, + 0x4312ef66527f6d8b, + 0x7b2f431ba1829bf7, + 0xe5f9d87baf84cb75, + 0x914cf7ecbe67c9d1, + 0xf3cb482feb6ad84f, + 0x974d65c2195df6ab, + 0x4b386a165ca13729, + 0xa3e69c587ba43695, + 0x5c62871ba79865f1, + 0x96ed74acb48a736f, + 0x19de74cba36c72db, + 0x2476ec5ed27fa149, + 0x85e761cede62bfa5, + 0xb7f9ea832f76ce13, + 0xea68bc432b46dc7f, + 0xa745df943948faeb, + 0xc3b92d587a6e1c59, + 0x27c6195cb9713ac5, + 0xe892357ed9856a43, + 0xc52f34eed346579f, + 0x5123dc81f35a871d, + 0x2eba6c92124da579, + 0xe2ba8df4316fa4e5, + 0xa36c75d98f72d463, + 0xf6abc5d87c45d2bf, + 0x172befaa9b58f13d, + 0x8739e56edb5c21a9, + 0x41537f2cb84c2ef5, + 0x6b9571a1f9615e73, + 0xa4c3e6b217435bcf, + 0x76891ae325367b4d, + 0x8364172652387ab9, + 0xf51a6479814dba27, + 0x8a9fc4587e2fc893, + 0xd246f83a9b32c6ef, + 0x92baef8dcb24f56d, + 0xd34127c1fb3815d9, + 0x9acd62b21b3c2547, + 0x8fa34797692e54b3, + 0xbc82ea6a9a628431, + 0x3d26f84ba634718d, + 0x369fcd7ba3257fe9, + 0xe79f541dc129ae57, + 0x57cf2d4a9f1badc3, + 0x623afc7feb2fdc41, + 0xfa5874d43c12fa9d, + 0x24916df65d362a1b, + 0xf2ed61965c192a87, + 0xd2e3ba18791b48e3, + 0xa7c1348cb92e5861, + 0xb1ae439dc62175bd, + 0x76b2da8fe614953b, + 0xc91e53d1f216b3a7, + 0x2b3d97c7642ac315, + 0xf9dac8354efbd281, + 0xd427b8c438eabfcd, + 0xd5c3fe887ae21f4b, + 0xdba3795989f42eb7, + 0xed6c1a7cb9f84d25, + 0x23145c9ed6fa5c91, + 0xe34629adc3eb59fd, + 0x764a982213ef796b, + 0xafdb829543f2a8d7, + 0x9e3546d871f6c845, + 0xde7694f65fe8d6b1, + 0xdf8265987bcad52f, + 0xef19584879cdf38b, + 0x2a63584dcad123f7, + 0xcb59a481fae64275, + 0xe92a7f8439e862d1, + 0xfd5c483325c96e3f, + 0x57a693f543dc6e9b, + 0xfd1832e763cf8d19, + 0xe4687dba91e2bc85, + 0xec49b6d98fb5cae1, + 0x82c6fd3bacb7d95f, + 0x74d5ac8fe8a9f7cb, + 0x8b314ac32bce1839, + 0xce8a12754bd137a5, + 0x1cbf92498ad56713, + 0x3cb816da95c8647f, + 0x71bf643984c973eb, + 0xf9248d7cb3cda259, + 0xbcf68e4ed2bfa1c5, + 0x31f5cb7edea4cf23, + 0x4bf982c21e94cd8f, + 0xb1e34cd32a86ecfb, + 0xb73a28e54cab1d69, + 0x7ba4ed87689e2bd5, + 0xe439625ba9c16b53, + 0xb2ae143dc6b358af, + 0x1873f49fe4b6782d, + 0x1958ec61f2cba689, + 0x5d7c4f62129ca6f5, + 0x23dfa1c541afc573, + 0x1efb6a465e82d3cf, + 0xd4baf8987c96f24d, + 0x81e96ad87da812b9, + 0x68721b5edbac4127, + 0x2986143dc79d4f83, + 0xf379ca5fe6815cdf, + 0xcf9ed62216937c5d, + 0x5fce948323857bc9, + 0x17ec98b65289ab37, + 0x3e5cfa47617dc9a3, + 0x6da9cf498e7fd921, + 0xc468bf3bac82f67d, + 0x67b513aedc8516e9, + 0xc9a53261fc9a2657, + 0x5d2643821a8b45c3, + 0x67fa49c43a9e7541, + 0xde7c46965681729d, + 0x75d6c3eba685921b, + 0xfc381e9cb285af67, + 0x2e367dccb168aed3, + 0x6487e5bbaf6bcd51, + 0xad7549fdc94febad, + 0x28be61f43e741c2b, + 0x472afb843d652b97, + 0xf4cb8a365b6849f3, + 0x59a23bc98a6c5971, + 0xfb7e5a2a974e56cd, + 0xc45e16fed571964b, + 0xb23146cfe263a4b7, + 0x491e7831f178c425, + 0x67bf8e55426ad391, + 0xf81c9b443e4ac1fd, + 0xe85cb6754a3def5b, + 0xadc926498b532fc7, + 0x67fbd18bab674e35, + 0xbed93f5dc9485da1, + 0xa195384ed74a6b1f, + 0x724ea681f43e6a7b, + 0xf17b46932541a9e7, + 0x2843c9b87243c965, + 0xa962b7598246d7c1, + 0x5ef628b87e29d63f, + 0x8eb164587d2cf49b, + 0x93847cecbc4f2519, + 0xad968b7fec624385, + 0xd14a29e1fa4763e1, + 0x14b9efd32a39715f, + 0xe8b1f4c435296fab, + 0xc48af757653d8e29, + 0x45aef1298431bd95, + 0x31a8d25a9234cbf1, + 0x4827fd1a9e15da6f, + 0xe16d284bac17f8db, + 0x13de6741fc2d1a49, + 0xc6f7b4a43c1f28b5, + 0xd1298fc87c146823, + 0xeb62a4d87a14658f, + 0x1fedb6aa961874fb, + 0x78f5241cb51ca369, + 0xf194de6cb41ea2d5, + 0x91cb7f5fe642d153, + 0x74bfe96babd2ce9f, + 0xdb7c45a32bc5fe1d, + 0x74fc51943cf81e79, + 0x1d3fc27549fa2ce5, + 0x96ab341879fe4c63, + 0x251674a987e159bf, + 0x9ce6f85cb6f4793d, + 0x96a3bc2ed3f587a9, + 0x276c3a8fe3fab817, + 0x786f95e212fdc683, + 0xdbe6f24431ceb4df, + 0xe7d1c9b76ec2f35d, + 0x24df31687de613c9, + 0x6542d38a9cea4237, + 0x8671ad5cb9ec51a3, + 0xa2f51eca96ab4def, + 0x6eca8b91f5c17e6d, + 0x962b43a215e37cd9, + 0xcadb654323e6ac47, + 0xcf37ed9652e8cab3, + 0xcb183f2872ecda31, + 0x897c2ea65cafe78d, + 0x95d1746badc317f9, + 0xda638c9fecd52867, + 0xb382e191fac946d3, + 0xc7e3f5432adc7651, + 0xa8dbfc1327be63ad, + 0x3aec8b9767d1932b, + 0xe391f4b985d4b197, + 0xa695f42982b6afe3, + 0x6175c8fba2b9ce61, + 0xc7ef12a98f79ecbd, + 0x9a721f3eda8efc3b, + 0x234de8621eb32ca7, + 0xe84dc1b43dc74b15, + 0x3857b1254bc95a81, + 0x9eab7865469a57ed, + 0xaecb7f5a94ae875b, + 0x3861c5eed4b1a5c7, + 0x986c75dfe2b4c635, + 0x34bea861f2b7d4a1, + 0x8653afb542a9d31f, + 0xbec8d5143e8cf17b, + 0xfd6e19465c9f21e7, + 0x19dc63e98ca23f45, + 0x92d3ea498a965eb1, + 0xc79a23ecb7986c2f, + 0x35c14f2fe47a6c8b, + 0xc4bf123fe36d8af7, + 0x3a675fb32491ca75, + 0xe984d3a65394c8d1, + 0x3dea48965196d74f, + 0xe268adb54e68f5ab, + 0x8fd5e1bbae8d1629, + 0x615c48ecbc8f2495, + 0x372b85aedb9364f1, + 0xdabc457fea95726f, + 0xe39158f3296871db, + 0xf8d765e3256b8f39, + 0x1a98d625436d9ea5, + 0xb521ea7a9582cd13, + 0x2efa3d5a9163db7f, + 0xac49f5d98d45f9eb, + 0x6b492faede6a1b59, + 0x8937d211fb6d29c5, + 0xbf7a6e521c7f5943, + 0xc5d1b9e43b72569f, + 0x2c1b5ef54a75861d, + 0x913c548cb658a479, + 0x374cd8aa946ba3e5, + 0xde7c652cb47ec263, + 0xb73e914dc362d1bf, + 0x68a5e73cbc54ef2d, + 0x61e89a732e461f89, + 0x4b7ef2d43c492df5, + 0xa42e85d76b5c4d73, + 0x28daf457683e4acf, + 0xec21fd9cb9527a4d, + 0x7893be4ed63478b9, + 0xaf9283cfe548b927, + 0xa975ebc1f24bc793, + 0xfca89bd2123cb5ef, + 0x458b23187251f46d, + 0x4cd8baf87f3514d9, + 0x9bfc654bae592347, + 0x8c3df41a9d4a52b3, + 0xb2753f9dcb5d7231, + 0xe1a38dccb82e5f7d, + 0xe5d6ba11f6327de9, + 0x743a96c21824ad57, + 0x63cafde54527abc3, + 0xdaf42358753adb41, + 0xd3f78ce7612ce89d, + 0x38b4792baf43291b, + 0x28e67d4dce142987, + 0x26583b9edc1847e3, + 0xd21857e1fc2b5761, + 0x81db9363291c64bd, + 0x39e7c4f6591f843b, + 0xabcf3e776813b2a7, + 0x51f9d84ba837c215, + 0x135c672ba428cf71, + 0x7d4568fa9218becd, + 0x94c1d7298ceafd4b, + 0xeb3f985dcaef1db7, + 0x3b7d8fe21df34c25, + 0xc57d1ef43cf65b91, + 0xdab1e92439e758fd, + 0xcfb9ea2545fc786b, + 0x7fd25b3984fe96d7, + 0x4a6d3efcb6f1c745, + 0xa8149bddc3f4d5b1, + 0x71dbf36dc1e7d42f, + 0x4be76c1431e9f28b, + 0x2cfa67954edc12f7, + 0x938fc7b76cdf3175, + 0x69bf48287ad35fc1, + 0xf5a7d16989c56d3f, + 0xed84937ba5e76d9b, + 0x194c523ed5eb8c19, + 0x67eb2351f3deab85, + 0x5cd746f435d2c9e1, + 0xcbe619f542c3d85f, + 0x9531a78541d5f6cb, + 0x943c25f76fdb1739, + 0xd14ca6798ecd26a5, + 0xedc2135babcf5613, + 0x5c17964edac2637f, + 0x24c63be1f8c572eb, + 0xab415de327d8a159, + 0x1ec9d75324ca9fb5, + 0xd21ef3a765adbe23, + 0xd32be1c763a1dc8f, + 0xba81d9687193eafb, + 0x7954d8cbafb71c69, + 0x15a6f73dceb92ad5, + 0xb2a93171fcbd4a53, + 0x36be4a921b9e47af, + 0x127c6d554ab3872d, + 0x1b25c84437c4a589, + 0xd6b594f876b8a4f5, + 0x1ebfc8aa95abc473, + 0x4d27feba938db2cf, + 0xb7f648edc3a2f14d, + 0x19d674bfefa521b9, + 0xb4fe68932ea83f17, + 0x31bd9ce32d9a4e83, + 0x2c5e76f4397a4bdf, + 0xc8e2f755498f6b5d, + 0x8694ef7cb6827ac9, + 0x9246ab7ed695ba37, + 0xb5124cafe497c8a3, + 0xe91b2c51f49bd821, + 0x283794f2128ce57d, + 0x38157bf763a215e9, + 0x37c249e98fa62457, + 0xb524e8187e9854c3, + 0xf491cbebad9b7341, + 0x18ea4fccba7c619d, + 0x4a1f652cb75d6ef9, + 0xb1a64251f582ae67, + 0xafb3cd421675acd3, + 0xc54dea643478dc51, + 0x5feb63254258e9ad, + 0xad86cb28716df92b, + 0x7e8632acbf612a97, + 0xd2c36e8cbd7548f3, + 0xb7c92a8fed695871, + 0xd75c9621fa4965cd, + 0x38e246921a6d854b, + 0x15cf47d3285f93b7, + 0xce13bdf87984c325, + 0xdb34915ba576d291, + 0xdc965a398246bfed, + 0x35b172eba149fe5b, + 0x1b69dc7baf4d1ec7, + 0x38bec5a1fe714d35, + 0x8f47a3e32e645ca1, + 0xf8ed47b43c476a1f, + 0xac72e1654c3a697b, + 0x89ec34a6563c98e7, + 0x16287cfba73fb865, + 0x6d1753ecb753d6c1, + 0xb429351dc246d53f, + 0xa7526bdfe147f39b, + 0xb2a1d646536c2419, + 0xdf7e94276f4e3285, + 0xb627d3e98d5362e1, + 0xe97a4f698b236e4f, + 0x2e46a95989256eab, + 0x9d65a23dc73a8d29, + 0xd82a1f6fe62dac95, + 0x21c87f9ed53ebaf1, + 0xf5e83ca21532d96f, + 0x18c9fd265324f7db, + 0xdf5684c8723a1849, + 0x2c49f1398f1c27b5, + 0x176e24bbad1e5723, + 0xf4de891cbc21648f, + 0xe8c6951eda1473fb, + 0x1d935a61fb17a269, + 0xf6ebdc943829a1d5, + 0xefba7d66571cbf43, + 0x81bf6ca6541ebd9f, + 0xfaed4b298523fc1d, + 0x73d69aecb3251d79, + 0x8e2c47aa9df72be5, + 0xf6d248bdcdfa4b63, + 0x2495e3ced9ec48bf, + 0x397ca2f21aef683d, + 0x9b6ef2c43bf286a9, + 0xce6ba79549f5b617, + 0x16fbc2d876f9c583, + 0xe418c62874e9b3df, + 0x73b2e14a93fce25d, + 0x726a351ed4f312c9, + 0xc5e32a9edfe64137, + 0xc7529bd21ed74f93, + 0xc18f9d432ab84cef, + 0x78ea265439eb5c6d, + 0x692b1dc547cf6bd9, + 0xc86243fa98e2ab47, + 0x61c589bba6e5c9b3, + 0x59e4312dc5e8d931, + 0xdcb57481f2cae68d, + 0x4769e38212bce5f9, + 0x46fe19c983e12567, + 0xdb5c1ea87fc645d3, + 0xc32b91d98ed97451, + 0xca3486d87bc962ad, + 0x726eb38ba9cd812b, + 0xba15f32dc5be9f87, + 0x8c7e32a1f6b2ade3, + 0x1934efc327b5cd61, + 0xf5ca37132396eabd, + 0x6b7493a652c9fa3b, + 0x198fabc762ce1ba7, + 0x3a5cf12a9fc24a15, + 0xaed4c3fcbec45981, + 0x85f6da3dcba756ed, + 0x7512ed81f9ca865b, + 0x354be6f218ad94c7, + 0xc6758b1328afb435, + 0xd493bc5767b4d3a1, + 0x4eb1c2f985a6d21f, + 0x3e9cad498297ef6b, + 0x856ce9fcb29a1fd7, + 0xf951683cbf9d2e45, + 0x67421951fe925db1, + 0xbade28421d946b2f, + 0x1cd568932d956a8b, + 0x5ba714943b6a89f7, + 0xa6e9b535468db975, + 0x51ca47ea958fb7d1, + 0xe1569d8cb592d64f, + 0x2f134b6ed285f4ab, + 0x45698b21f3ba1529, + 0x96efb38541ac2395, + 0xc23be5754e8d53f1, + 0x8cb63d465d92716f, + 0x3f1d68765a736fcb, + 0xc14d753bab768e39, + 0x15afd84dc7689da5, + 0x689ca5ffe67dbc13, + 0x9178a4fed35eca7f, + 0x8baf42521462f8eb, + 0xc8b25e9543861a59, + 0xf7241897617928c5, + 0x13a2bc7a9f7c5843, + 0x591d74698c6d459f, + 0xdf38156cbc72851d, + 0x6c74bd8fec64a379, + 0xd9a6b371f967a2e5, + 0xc569d8f3297ac163, + 0x954a38e32549beaf, + 0x1f987537645fce2d, + 0x7d923efba4631e89, + 0x49f7b23ba1762cf5, + 0x1fe2c73cbf594c73, + 0xa35ce97cbd3a49cf, + 0x9861ca71fb3e694d, + 0xb6e147932d4187b9, + 0xb6cfe4843c54b827, + 0x63b19c865a47c693, + 0xe3a568b87638b4ef, + 0xf14eb53a954be36d, + 0xd8349bfba34ef2d9, + 0x9d21b43fe1853247, + 0xb7f9318fef4751b3, + 0x487961d43e496f21, + 0xadbc29f43c2a5e7d, + 0x5cda7e654a2d6ce9, + 0x4a3d95198b31ac57, + 0x5db3f18a9824bac3, + 0x7a56891dc837da41, + 0xae16578dc428e79d, + 0xd79ba85fe43cf71b, + 0x6a3b14c3243f1687, + 0xc63a7599815246e3, + 0x18dbfc5a9f287561, + 0x4da19c687e1863bd, + 0x3e8bc6aa9d1c823b, + 0x65f3291dcb2e91a7, + 0x7154af3dc821aef3, + 0xadbc1491f824ce71, + 0x57d8af632615ebcd, + 0xace71d843518fc4b, + 0x9fb7e2c7642d1cb7, + 0x7621c8ba941f3b25, + 0x5d314f698ef25a91, + 0x423df7ba9be357fd, + 0x342c7ebedcf5876b, + 0x927564dfe8fa95d7, + 0xd5439b7219fdb645, + 0xea49168437efc4b1, + 0xf81ae43767e4d32f, + 0x52f1b9c874e5f18b, + 0xf9312c5ba4e921f7, + 0xf2684beba1eb2f65, + 0x35ac1dea9fbd4ec1, + 0xfdb37c5febd16c3f, + 0x9feb36721de36c9b, + 0xea79b8443ce68b19, + 0x17462a5437e9ba85, + 0xc8ed96f656dcb8e1, + 0xd724bf5984bec75f, + 0xa8123bfa94d2f5cb, + 0x39b8a54ed4e71639, + 0x3b564e21f1e924a5, + 0xf5bca27542ec6513, + 0xae724d643ebd527f, + 0xa83d26b65dc271eb, + 0x78bef3976bc38f49, + 0x28e3b61878c69eb5, + 0x3b5f2e9ba7c9bd23, + 0x473fc98ed49acb8f, + 0xf49a235dc38ed9fb, + 0x8bf5316325d31b69, + 0x6fbe851543c629d5, + 0x8215ade871da4953, + 0xab792f465e9b46af, + 0xf37a29698cae762d, + 0x16ad7cecbdc1a489, + 0x59c6b4aed9b4a3f5, + 0xe6bc7311f9b8c273, + 0x1fc537632698b1cf, + 0xade58433258acf3d, + 0xdabc8175437dfea9, + 0x3c15d42a95b43e17, + 0xd38b76fba1b64d83, + 0x1a3de87a9e874adf, + 0xf35bae2dce8b6a5d, + 0x8b62a9d1fb7e68c9, + 0x93dafc832da1b937, + 0xb3c6d8532b94c7a3, + 0x6f74dec659a8d721, + 0x4c82eba76589e47d, + 0xdf49b2a9847bf3e9, + 0xdaf3927dc4af1357, + 0x59783affe1a452c3, + 0xf8cbd63fefa87241, + 0x4f3682721e675f8d, + 0x7c465e932c5a6df9, + 0x245f79843b5e9d67, + 0xa748efb76971abd3, + 0xc268ebdba984db51, + 0xac986d4cb465e8ad, + 0xc761a95ed469f82b, + 0xde67acb1f36d1897, + 0xbe3827f2148e27f3, + 0x2dc4ab1982a35671, + 0xd1f29c643f7564cd, + 0x65d23ea87e69834b, + 0x12e47ac98d5c92b7, + 0x8691b2edca7eb125, + 0x86b7ef1ed962cf81, + 0x7de5a8b1f653bced, + 0x25e63f421746fd5b, + 0x5972fc1434591dc7, + 0xbfc15a69847d2c35, + 0x6ab72e59826f4ba1, + 0x5fb946cbae53691f, + 0xf26d9bedce34687b, + 0xb7f6539edc3896e7, + 0x5287ea11fa3cb765, + 0x6a5d7ce3294eb5c1, + 0xbd41c9665961d43f, + 0xe2ac74576754f29b, + 0xf4a8217cb7682319, + 0xf952eb6dc46b3185, + 0xe9568cdba25b4fd1, + 0x281467bbac2e5d4f, + 0x87db3e41fe326dab, + 0x3fe9cab21e358c29, + 0x2fde18743d27ab95, + 0x1bf28a96583ab9f1, + 0x214879f6572dc86f, + 0x5127faea9731f6db, + 0x37e8946ed8351749, + 0x649d231fe43826b5, + 0xec258791f14b5623, + 0x95fa61c5412c538f, + 0x96732ab54d1e62fb, + 0x5c8fb3187e23a169, + 0x452f39687b149fc5, + 0xea7cb13a9a18be43, + 0x5fc267eba618bc9f, + 0x9c58fd1ba62ceb1d, + 0x6e7283b1f6321c79, + 0xe4cda56437142ae5, + 0xb4c286d875184a63, + 0xd1c395f7621947bf, + 0xca7e1bd65efb673d, + 0x27fba8476cfe75a9, + 0x8c9f542bacf2b517, + 0x72fc568edaf5c483, + 0xf84de7bdc7e6b2df, + 0x4fb7a65327f9e15d, + 0x735c8df324daefb9, + 0xc7fd3e5765de1f27, + 0xf27d49b985f24e93, + 0x5764d91981d54bef, + 0x4a7f1b5a9fe85b6d, + 0x52fd67398ceb6ad9, + 0x3b864ed1fbde9a47, + 0x6fd73e432ae1c8b3, + 0xe68cbd554ae5d831, + 0xc84fb9e437c6e58d, + 0xb97384a765c8e4f9, + 0xb9fc51dba5ed1467, + 0x4e7fdb9ba5cf24d3, + 0xb645193ed2e47351, + 0xf7d69c8fefc561ad, + 0x8743d9532ec87f1b, + 0xabd541f32dcb9e87, + 0xf7813e2548ad9ce3, + 0xd318549879b2dc61, + 0xbd536a1876a3e9bd, + 0x6cb5231ba5c6f93b, + 0x2f3cd6afe4db19a7, + 0x1bc6e3d1f4cd3915, + 0xca14def323cf4781, + 0x35a967d541b265ed, + 0xb6d7e9c43fc6845b, + 0x47dca2865eb893c7, + 0xc9bade198dacb235, + 0x386f47acb89ec2a1, + 0xd2c835bba681befd, + 0x45ef632ed593fe6b, + 0x19ef3da325a61ed7, + 0x29fbe8c436ba2d45, + 0xd7591bf7639d4cb1, + 0x2df95488719e5a2f, + 0x92af84187fa2698b, + 0x5372e68cbda498f7, + 0x5ab163cfeda9b875, + 0x97368511f98ab6d1, + 0xd54b93f2198dc54f, + 0x38ac7b254781f3ab, + 0x5c1982a878b61429, + 0x31d698cba6b83295, + 0xae21d94cb49a52f1, + 0x741e26fba18b4e5f, + 0x573fe6ba9d6f5ecb, + 0xc84b52d1fe728d39, + 0x2d937ba21e749ca5, + 0xab8c52754d78cb13, + 0xf962a844385ac97f, + 0xa175c8e5465cd7eb, + 0x7f91b54dc7a21859, + 0x25f3aebed69427c5, + 0x628adb9fe2a95743, + 0xf84631bfe17a549f, + 0xf5d7e694328c741d, + 0xbce126543e5f8279, + 0xe491cf776d73a1e5, + 0x5e7b91698c76bf53, + 0x6412c5d87846bdaf, + 0x253db47ba759ec2d, + 0xd7395cacb54dfc89, + 0x5bf16c3fe6712bf5, + 0x6b93875216854b73, + 0xe2cd6174325648cf, + 0x98d3cb58715a684d, + 0xa2967be65f3d76b9, + 0xaebd7f2a9d4fa627, + 0xd153f86cbd62c593, + 0x79165badc945b3ef, + 0xa2bd98e1f948e26d, + 0x78b46a13274af1d9, + 0xcf8eb766596e2147, + 0x5b72c6a987614fa3, + 0xecd972bba4756e21, + 0xd2c8f35ba1365c7d, + 0xf923e74baf286be9, + 0x4f35be2dce2d9b57, + 0x9fa7db4feb2fa9c3, + 0xafd796432c53d941, + 0x8e4d1a243a24e69d, + 0x32c6eb965938f61b, + 0xed47b91ba93c1587, + 0x2819de5ba74d25e3, + 0x93f846ced8527461, + 0x9d5b48cfe13462bd, + 0xb62da59fef27813b, + 0xb67cf3e32e1a8f97, + 0x913c8fd54c1b9df3, + 0x8924cf765a2fbd71, + 0xc9a5db276812eacd, + 0x21c84fba9815fa4b, + 0x8b5fe27ed6281ab7, + 0xf84a621fe71c3a25, + 0x4edb1521f52e4891, + 0xfd2b97e4342156fd, + 0x68fdc5987213856b, + 0x92e867d43ef594d7, + 0x29ba34e87df9b345, + 0x95f43a2879fac3b1, + 0x2e4adf3a98edc12f, + 0x12f8bc7ba6d1ef7b, + 0x41387addc6d41fe7, + 0x8ba2394217f82e65, + 0x7b85cfe435f94dc1, + 0x43a9cf1762ec5b3f, + 0xcda8351761ef5a9b, + 0x164a5bc87fe38a19, + 0x1cbe946bade4b985, + 0xf7ab1dedcad8b7e1, + 0x76f2a85fe8dac65f, + 0x9a8d5e7217ade4cb, + 0xe4a271c76ae21539, + 0x1ea95fb878e623a5, + 0x3fb675cba7e96413, + 0xb6d8f75a93da517f, + 0xd146ebf981ca5fdb, + 0xeb6952dbadbf7e49, + 0xa79d4611fec29db5, + 0x85b724a21ed6bc23, + 0x38c6bf7329b6ca8f, + 0xbf4c51a436a9d8fb, + 0xfeba981545bdf869, + 0x72319e5ba7c128d5, + 0x6a84132dc7d64853, + 0xc7b14e3ed2c745af, + 0x5d47e8b1f1ca752d, + 0x6bf8e94321cd7389, + 0xfa75ce943dae92f5, + 0x4a218fc76eb4c173, + 0x413ba7665984aebf, + 0xdb571a476897ce3d, + 0x27863c1cb578fda9, + 0xd7e9b3fdc6ae2d17, + 0x7eb15c91f6b14c83, + 0xfd58eb3215a349df, + 0x67bf21e432b7695d, + 0x21cf9ea541ba67c9, + 0xfed46c165f9da837, + 0xcbe492887d8fb6a3, + 0x6872ca5cbca4d621, + 0x4efd582dca95e37d, + 0x98b42eaed687f2e9, + 0x1a26f4b439ac1257, + 0x1afd3b76579e41c3, + 0x7e41a63987a26f31, + 0xa42c86b872935e8d, + 0x92eb81cba1856cf9, + 0xd842ea5cbf5a9c67, + 0xc597214cbe6c9ad3, + 0xc3b5d7afeb7fca51, + 0x6fd7c3b21b62e7ad, + 0x8524c6a43a85f72b, + 0xb8ac31954b8a1697, + 0xdeba461a978b26f3, + 0x986ef52cb69e4571, + 0x752c61ecb48163cd, + 0x7d58293fe195824b, + 0xf726839fef5691b7, + 0xcb8aef532e69af15, + 0x9dcf26443d5cbe81, + 0x1a85d2b4384fabed, + 0xb4cd1e587962fc5b, + 0x82f6d5cba9651bc7, + 0xab71926ed8792b35, + 0xa2d6839fe56c49a1, + 0x63f821dfe36d581f, + 0x7efa3dc32351867b, + 0x86ad37c5416395e7, + 0x196fdba87f38b465, + 0x9e2a18687e59b4c1, + 0xdc1937f98a5bc23f, + 0xfb3c7d6ba84fe19b, + 0x4fd78c3feb753219, + 0x15637cbfe9462f75, + 0xb73ec81327584ed1, + 0x49513863263a5c4f, + 0x3a2ed157623e5cab, + 0x6315942ba3518b29, + 0x59d3be698f23ba95, + 0xc5e1f34bad36b8f1, + 0x2f8651cedb29c76f, + 0x95a67c81f82ae5db, + 0xc29ea6b21a2ef549, + 0x4913e5887a6324b5, + 0xa514e82a9a486523, + 0x4c7d986ba639528f, + 0xd1ecb38a943a61fb, + 0xc37de16cb12d7f59, + 0x1e846c7cbf219ec5, + 0x17493b61fe15bd43, + 0xf73418d32d15cb9f, + 0x57b26dc54b28ea1d, + 0xa7bc8e65481cfa79, + 0x6cb24d18782f19e5, + 0x6931bdedca124963, + 0xf582b74dc71546bf, + 0xd253a78fe419763d, + 0x9c65a1b1f21c74a9, + 0x491ec766532ea417, + 0x1b9f5d654defb283, + 0x9ce8db665ae3b1df, + 0xb2cd897769e5cf4d, + 0xc12d793657d6feb9, + 0xc2d8f46ba8fb1e27, + 0xdcf6548cb6fe2d93, + 0x913d64fdc5d14aef, + 0xb36afe9214f35a6d, + 0x56d18bc432f568d9, + 0xf4b71ce651fba947, + 0xb639a1d65feda7b3, + 0x5bca4e198bdfc731, + 0xb3752d6a9ac2e48d, + 0x35fec12cb8c5e3f9, + 0x7c2461b1f9ea1367, + 0x96b5fc4218eb42d3, + 0x9f28576548de6251, + 0x749f38b764c15f9d, + 0x37dbfe4983d47e1b, + 0x3c9d8b7ba1e59d87, + 0xbde194387fc89be3, + 0x647bef1a9eadcb61, + 0x72f86cbfe79fc8bd, + 0x7d68c3b21ac2f83b, + 0x68ad42f43bd518a7, + 0x1789a54769da3815, + 0x17b5238a97dc4681, + 0xf629315983ac54ed, + 0x7fd2153dc4d1835b, + 0x3986725fe1d492c7, + 0x6b372a1fefc8b135, + 0xd1e9f4c32ea8bf91, + 0x86d47f132b79acfd, + 0x1bfe72c4398fed6b, + 0x3159f8e769a31cd7, + 0x98c5d27ba9b72c45, + 0x3f8c952ed6c84ab1, + 0x953726aed4ab592f, + 0x127cdb31f2ae578b, + 0xa41579c323b196f7, + 0x7163c92541c3b675, + 0x386cb9d54f97b5d1, + 0x21a7be876d89c34f, + 0x9ca2bdf7697ce2ab, + 0x5f1382ccba8ef129, + 0xb726415feab43195, + 0x46b8c13ed7964fe1, + 0x654af3d216984d5f, + 0x5e796fd323795dcb, + 0xc3e1a426528e7c39, + 0x2c48b36872819ba5, + 0x5cb1a62a9f85ca13, + 0xc4b27febad65c87f, + 0x483f657dca58d6eb, + 0xc54db1ffea7cf659, + 0xa35f18432a8f16c5, + 0xa29851f87ba25643, + 0x9ca571254786539f, + 0xe69375bba589731d, + 0xe6cf1d9cb36c8179, + 0x96f4312ba16c8fd5, + 0x92b8f13dcf71be53, + 0x42b581dfed53bcaf, + 0x29d534c21c56eb2d, + 0x67139d432c47fb89, + 0xde71afc5496c1af5, + 0x45763dc9896f2a73, + 0xd4358fbba86247cf, + 0xed63b19dc385674d, + 0xf17d64cfe24875b9, + 0xb6859ca1f16ca527, + 0x581acbe3216eb493, + 0xc76e89b54d51b2ef, + 0xb28651987c54e16d, + 0x15d72ce76a35efc9, + 0x6375caea9b5a1f37, + 0x6c287e1cb85c2ea3, + 0x4926387dc86f5d21, + 0xa147c291f6425b7d, + 0x6a38d24215346ae9, + 0x3dc1975542389a57, + 0xc453b8f7614ba8c3, + 0xb21d48987f3ec841, + 0x1c34de298c31e59d, + 0x517fd36bac34f51b, + 0x4bfd526fec391487, + 0x1ca59631f95a24e3, + 0x8c351b932a4d5361, + 0xf9cb7de5473f51bd, + 0x7ec9fa5986437f2b, + 0x519d423ba3248e97, + 0x12db48fba1279cf3, + 0xf84b52ea9f2abc71, + 0x13df7c598a1eb9cd, + 0x4c6b5dafec21f94b, + 0x5e91dca43d2419b7, + 0xa894c1f76c183925, + 0xb3e5a4976a2b4791, + 0xeba2c659871b45fd, + 0x7c23649ba51f746b, + 0x48d72eadc51293d7, + 0x92b4cf7fe317b245, + 0x38bc46fedef7c2b1, + 0x84e19ba32cd8be1f, + 0xbd5eaf1329fade7b, + 0xf91b458438bdfce7, + 0x427cefa98af32d65, + 0x461dc25a98f64bc1, + 0x94c58edcb6e85a3f, + 0x47c15f6ed3fc589b, + 0x6af3b9ced3fe7819, + 0x5bd7861323f1b785, + 0xdf672c8652f4b6e1, + 0xc76a9f543ed7c45f, + 0x327d4ca65ad8e3cb, + 0x2a43e9187adcf239, + 0x7ac5e12cb9df12a5, + 0xea7129cedae56213, + 0x9743c58ed7c54e6f, + 0xe2fca8b214c75edb, + 0xbce154f323eb7d49, + 0xbead367542de8cb5, + 0xacfd425984e1cb23, + 0xdba4f9176eb3c98f, + 0xf5cb6d298ca5d7fb, + 0xf1a8369edbcaf769, + 0x52c6b181f9bc17d5, + 0xc4f526321acf2753, + 0x6c98ae5438c254af, + 0xf3a1c49658c6742d, + 0x7a1fdcb764da7289, + 0xac173bf983cb91f5, + 0x27381d6a91bdaf63, + 0x2f138c4a9e81adbf, + 0x28ad7341fb94ec3d, + 0x3edb48621d85fca9, + 0x8edb52354dba2c17, + 0x6f9cdea659ad2b83, + 0x6af9c716569e38df, + 0xf8c1d4bba7b2685d, + 0xef6a7c8ed3b476c9, + 0x2c1dbfafe2c9a637, + 0x3ac4e5b1f19cb5a3, + 0xf23e87c543aec521, + 0xf3d12a554f91e27d, + 0xb31a97d65c84f1e9, + 0x2bc3e1998db92157, + 0x86fa3e187a892fb3, + 0xedf2c83cb89c5e31, + 0x5e8df76cb57f4c8d, + 0xb1c34a8fe4826bf9, + 0x543ba27213a49b67, + 0xe3a2c7b54287a9d3, + 0x79ec2417628bc951, + 0x9cf6ba354f5ec6ad, + 0x8da53bea9d81f62b, + 0x85e1ad2dcda41597, + 0xb547186edb9825f3, + 0xeda41851fa9b5471, + 0x4f8c9ed2187b52cd, + 0x7192ba44368f714b, + 0xa1b836c654628fa7, + 0x5d6a1b8a9386ae15, + 0x3c976f1ba267bd81, + 0xa452d8e87f48baed, + 0x7a8e4b5a9c4dea5b, + 0x329165e1fd621ac7, + 0x3d678c921d862a35, + 0x8c97ae643c6748a1, + 0x6e5329c5496a571f, + 0x1df687ba984d657b, + 0xec194bdba35f84e7, + 0xe2b95f6ed482b365, + 0x6db31a8fe276b3c1, + 0x74f9618ede58c13f, + 0x64e2cba21e39df8b, + 0xb7451a632a3bedf7, + 0x139eb4798c612e75, + 0x52ecb9d98a654cd1, + 0xb4d92c6ba9375b4f, + 0x4f79c16ed63859ab, + 0xa3f62c9fe54d7a29, + 0xf96ad71fe23fa895, + 0xc5dfa6e32453b7f1, + 0x3acfb4e87134c56f, + 0x4873fe965f27e4db, + 0x6b98cad87d2bf349, + 0xc3deb65a9c4e13b5, + 0xf4b1586edc716423, + 0x4bc796eeda34518f, + 0xab23847ed7265feb, + 0xd48729c2162a7e59, + 0x7a841654342b8dc5, + 0xf1a39c58752fac43, + 0x458f31687132ca9f, + 0x651b29498f25e91d, + 0xd542fc6cbd16f879, + 0x6853491edc2b18e5, + 0x1edc6941fb1e2863, + 0x5fb2edc43a2145bf, + 0x17bc8fe76a14753d, + 0xe261d8f6581673a9, + 0x43b7e61a962ba317, + 0x4d7feb9ba52db183, + 0xe5bc9d79821d9ecf, + 0x57c21fba9bf1ce4d, + 0x9df2b67dcae3fdb9, + 0x78c59df43cf81d27, + 0x6eba1f354bfa2c93, + 0xb51e2dc547db39ef, + 0xa416ceb657ef496d, + 0xf685741ba5f267d9, + 0x7fd82bedc3f5a847, + 0x6274b1fed2f8a6b3, + 0x15b497ffe2fbc631, + 0x6c48a31321fec38d, + 0xb37df8654dc1e2f9, + 0xda5614c98de51267, + 0xdb62a5c87be841d3, + 0x4c637a2989da5f41, + 0xd9c7e1b986cb4e9d, + 0x9e6c534ba5cf6d1b, + 0xd742c131f4e29c87, + 0xb246f38214d59ae3, + 0x2ea9587543e8ca61, + 0xab57cef541e9c7bd, + 0x6cd34b165fade73b, + 0x23cf56ba9ed216a7, + 0xc19236acbcd63715, + 0xf2893a1febd94581, + 0x8c324911f7b953ed, + 0xea854c7218cd725b, + 0xc476eb9435bf81c7, + 0x56a9b34876c3af25, + 0x3f41e6a873c5be91, + 0x8e12b9487196abfd, + 0x12d5caf87f89ec6b, + 0xeca5fd2a9b8cfad7, + 0x1e8d4b71fdc12b45, + 0xe9b8df432dc549b1, + 0xa9bc45143ab7582f, + 0xa51e9db437ca568b, + 0x273e81d764ac85f7, + 0xf85c67aa93bfa475, + 0x12fea8ddc5a3b4d1, + 0x598472ced1a6c24f, + 0xa2365efedf87e1ab, + 0x74cdb5632d7aef19, + 0xf87eb6a43c9d1f85, + 0x491d5ef76b924de1, + 0x49e521687a934c5f, + 0x1a6d2fca97865acb, + 0xb1524c6ed58a7b39, + 0x5f21bc3fe37d89a5, + 0x5b3a61dfe48fb913, + 0xacbe36221392c67f, + 0x72b8d9543184d5eb, + 0x65f78cd43e78f459, + 0xd1896c387e8b14c5, + 0xc6f39ebbac9e2543, + 0xe25b46fdcb81529f, + 0x4359682fea95721d, + 0x68fb2a9fe4857f69, + 0xb6d5f34214698ed5, + 0x1fc8eda3247cad53, + 0xf7e8cb95425e9baf, + 0x42a61d998173ea2d, + 0x25a3e6b87e54fa89, + 0x1a926c3cbd6819f5, + 0x2fa693cfed6c2973, + 0x4a6829bfe95d36cf, + 0x7ade63832b81764d, + 0xbca917632a6374b9, + 0x7b6cf4a65968a427, + 0x1a2e93c9856ab293, + 0xe3da1459835ba1ef, + 0x1d2465fa914ebf5d, + 0x236cbe5bad42fec9, + 0x382da491fd561e37, + 0x8d4a2c921e582da3, + 0x537bafc54d6b5c21, + 0x1fcb4926593e4a7d, + 0xd8a952c87a4168e9, + 0x1a82b59dc843a957, + 0x635e97aed546a7c3, + 0x97c8145fe35ac741, + 0x943bd6c1f13bc49d, + 0x78e96b14325fe41b, + 0x218e5fa76f541387, + 0x67341dc98d5742e3, + 0x7db4f86a9d4a5261, + 0x9a5d612878294fad, + 0xd234c96ba83d6e2b, + 0xf4d2839fe6318d97, + 0x45c6abdfe6249bf3, + 0xc13db9732536cb71, + 0x178c6d954327b8cd, + 0x842a9cd7612ce84b, + 0x3271e6f65d1ef6b7, + 0x846715dcbe143825, + 0x2ef9a3ddcd274691, + 0x1e469d7dca1854fd, + 0x8172b391f91c736b, + 0xf7c491b4391e82d7, + 0x1bcef8d87932b145, + 0x4b15cf287624bfa1, + 0xa14759d98426bd1f, + 0xf71e6b2a9218ed7b, + 0x9a45edc76cd9fbe7, + 0xd61e754babfe1c65, + 0x91a6d27febf24ac1, + 0xce953a721be4593f, + 0xa1f36be32af6579b, + 0x93cae67546fb8719, + 0xf598b1a874fda685, + 0x564faeb984dfa5e1, + 0xef5b7d4ba4e2c35f, + 0xce17df4ba1f5e2cb, + 0x6df1593dced8f139, + 0x1a7e52443fec21a5, + 0xc87ab3654abc3ef1, + 0x9fb81c365ac14d6f, + 0xbf58e43768e35cdb, + 0xeb47126ba8e67c49, + 0xf3569a4dc4e98ab5, + 0xa54df67dc5edba23, + 0x3a7c52eed2ceb78f, + 0xea9b7d5213c2d6fb, + 0x86149ed431d4f569, + 0xa85df6954fc916d5, + 0x79bc23d98edc2653, + 0xa862cf3879bd43af, + 0xa64d289cbac1732d, + 0xc97423dfead47189, + 0x4b652e1ed4b68fe5, + 0xf32859b215c9ae63, + 0xc5f3d143238a9cbf, + 0x8d213946529fcb3d, + 0x94835da761c2fba9, + 0x53412dba9fc62b17, + 0x4e9a6c5cbec92a83, + 0x9145afbdcb9a37df, + 0x9e4a2361f9ae475d, + 0x1b5e4d632ab175c9, + 0xeb54d87329c4a537, + 0xd4ecb19656c7b4a3, + 0xc3621df986bac421, + 0x16bd94a9839bc17d, + 0x6c19f3a9817ecfd9, + 0x29a74f5dcea31f47, + 0xbd847231fd962eb3, + 0x9d5c84332ea95d31, + 0xca861e732c7a4b8d, + 0x5a8de4f4387d5af9, + 0x186472b658b19a67, + 0xf245c87cb694a8d3, + 0x6b51f83ed4a7c851, + 0x45f6dc2fe278c5ad, + 0x49751cb1f18ce52b, + 0xf7dbc943218ef397, + 0x3dc2ef176e9524f3, + 0x1ac48df76ea85371, + 0x278da3976b7851cd, + 0x4e3a9579897a6f3b, + 0x67c891ecb85d6ea7, + 0xf5acdb9fe782ad15, + 0x2d1e8cb1f574bc81, + 0x29eb8fc21365b9ed, + 0xe4672fa43268e95b, + 0x9d61a7b5415bf8c7, + 0xa2d5bc798e7f1935, + 0xa731c8fcbe8347a1, + 0x29a346dcbc87561f, + 0x1b27596fec59647b, + 0xa83e6241f95b83e7, + 0xead6b272197ea265, + 0x3e2f9c165873b2c1, + 0xafd961e87564be2f, + 0x32acb8e87245de8b, + 0xefd134aa9148ecf7, + 0x356c914baf4c1d75, + 0xcbfd458bac5f3bd1, + 0xb5dac64fec625a4f, + 0x856abcf21d3458ab, + 0xf584c1b43c4a7829, + 0xf3569dc5483ca795, + 0xd1f57cb9874da6f1, + 0x1f25c7eba751c46f, + 0x38d45fbba254e3db, + 0xf4e3a25ed157f249, + 0x1c39d82fef4a12b5, + 0x3c2d9be54f6d5123, + 0xebca36f54b2d3e7f, + 0x93cfa4876a325deb, + 0x7f5a39198b247d59, + 0x5f813b4ba9278bc5, + 0x3891e2ced72cab43, + 0x84da927dc42db89f, + 0xa3298e41f542e81d, + 0x938742521423f679, + 0x4f58d3b7623817e5, + 0x21afe6d98f1b2763, + 0x3c845d687d1c34bf, + 0x4fb5817a9b1f643d, + 0xf5c76baedc1372a9, + 0x8ba6932feb36a217, + 0x89c6a43fe618af73, + 0xfc31ad8325189dcf, + 0xed5acb74351ebc4d, + 0x2d9fe7476421fcb9, + 0xdf43196ba4351c27, + 0xa27134f98ef62b93, + 0xa7bc86da9bd738ef, + 0x7319f82dcafb486d, + 0x94ef762dc8fe56d9, + 0x147aec632bf1a647, + 0x4da36f8328f4a5b3, + 0x987132a767f8c531, + 0x3ea421f764f9c28d, + 0x1b29ead873ebd1f9, + 0x6d172bca91cdef57, + 0x83f695dbaed42fc3, + 0x53c146d1fcd75e41, + 0xbda4c6321be74c9d, + 0xace15f6439ea6c1b, + 0x57ca9be439de6b87, + 0xa89457f767d1a9e3, + 0xe5398bfba7e4c961, + 0x71df23ca93e5c6bd, + 0xed8735adc2d9e63b, + 0x9a2346bfe1dcf4a7, + 0xd5837e9543df2615, + 0x428ce7576fd35481, + 0x1dbfa8654cb652ed, + 0xa51c37d76cd9715b, + 0x2b483df658ca6fb7, + 0x79e51f2ba7bd9e25, + 0x3c856fafe6c2bd91, + 0xa591d47fe493bafd, + 0x9fe4a8b213c5ea6b, + 0x98ac7d4432b8f9d7, + 0x352ecab872cd1a45, + 0x32a187976eaf38b1, + 0x8af5d32a9db3572f, + 0x1567de9badc4658b, + 0xf7842c6edab984f7, + 0xb27a3651f8bca375, + 0x4c1ba9f3279ea3d1, + 0xbac31f9657a2c14f, + 0x9d12ca865483df9b, + 0xd465b81873a6fe19, + 0xda2ce73a92ba1e85, + 0xf5d81a3a9f8b3ce1, + 0x4b16c25bac8e3b5f, + 0x5ae8d761fd8259cb, + 0xfd65be721db57a39, + 0x98fa5d332cb798a5, + 0x9c2efab6579cb813, + 0x8bfa14e7648db57f, + 0x45db7a2a9581d4eb, + 0x8d4e963dc2a4f359, + 0x1f728adfe2a813c5, + 0xb9235a8fef9b5243, + 0x458aed632e7c419f, + 0xcd41e8532a6d4efb, + 0x9cb2f6554c827e69, + 0x24c98a176a748cd5, + 0xc1f5739cb978ac53, + 0x9af1348dc458b9af, + 0xc6432aecb46ec92d, + 0xc9351f4fe361f789, + 0xa3def763239418f5, + 0xb627d34651a92873, + 0x87ce1f254e6935cf, + 0xdbe4ca298e7c654d, + 0xc36de5f98c5f63b9, + 0x2e463f7edc84a327, + 0xd9375f2fea76b193, + 0x538d97fdc5469edf, + 0xfd964ea21649be5d, + 0xf7c49a83234bedc9, + 0x7c5b38aa95821d37, + 0xe84d263a91752ca3, + 0xd7f5c69baf685b21, + 0xa438c52cbe3a497d, + 0x2e78f4bedb3c57e9, + 0x8c6327afeb3f9857, + 0xefac5b221b52a6c3, + 0x9b8ca2443a57c641, + 0xfc6213e65647c39d, + 0xba7e36d9865ae31b, + 0x52ecf67ba34df187, + 0xe2a8754dc57241e3, + 0xa496b8edce364f51, + 0x3bc298d1fc264ead, + 0xa9f52ce21e396d2b, + 0x768b41f43b2d6c97, + 0x1f39e7a6592e8af3, + 0xc3614b998943ca71, + 0x1423f5ba9624b7cd, + 0x136b5a9dc528e74b, + 0x73e12a5ed32af5b7, + 0x1c5a6471f34e1725, + 0xa5bd234873624591, + 0x94a78d176e1453fd, + 0x1382ceb65e18726b, + 0xe97cd2476c2a81d7, + 0x47ea2d598a1c9f35, + 0x951f764cb72f9ea1, + 0xf4e6753ed723bc1f, + 0x734a2d11f514ec7b, + 0x49eb17332416fae7, + 0xdb158c28742c1b65, + 0x263b5ae8742e39c1, + 0x148ef7376cde483f, + 0xec4613598df2569b, + 0xc4317d9cbcf58619, + 0xc1a3724edbf9a485, + 0xaf9b731ed7fba4e1, + 0x4fce29b217edb25f, + 0xab57d69546f2e1cb, + 0x938d1bc765d4ef29, + 0x67e3a5b983e71f95, + 0xb497af5982e93df1, + 0x7c26e4b98edb3c6f, + 0x5d47eb2989cf4adb, + 0x4d3a58b1fce27b49, + 0x2ae6cb521ce489b5, + 0xac2edf554ae8b923, + 0xe52b7ca435dab68f, + 0x7a49f2c764adc5fb, + 0x621749dba5d1f469, + 0x8ea9734cb3e614d5, + 0xf829ab7ed1e92453, + 0x43aec28edec942af, + 0xf19725d43fbc612d, + 0xad17b6832cbe5f79, + 0x82fb3d654ab28de5, + 0xbf64dc2879c5ad63, + 0x1af39eb875c69abf, + 0x637fdbe985b9ca3d, + 0xb78943fdc3bde8a9, + 0xa764ed11f5d32a17, + 0x6928aed214d52983, + 0x9db81f2541b736df, + 0xce6fd1a43fba465d, + 0x79462bd65ead64c9, + 0xbc2916398cbf9437, + 0xf84512ced9c4b2a3, + 0x5b748dafe9b7c321, + 0x8bc7a41fe497bf6d, + 0x3ab7e4621478ced9, + 0x5f13c693239cfd47, + 0xad3f6ec875a12db3, + 0x8cda615a92b65c31, + 0x52cf6ab87f964a8d, + 0x9e16247cbd7a58f9, + 0xd937b2cfecad8967, + 0x46da7bcfea8f97d3, + 0xa563fd432ba3c751, + 0xc586f3732785c4ad, + 0x6c479be65698e42b, + 0x973d1cb7648bf297, + 0x7d9b21eba59d12f3, + 0x96835bfed4b35271, + 0x69b3854bae734fbd, + 0x648c9721fd876e3b, + 0xf78459c21e596da7, + 0x5b8e92643b7d9c15, + 0x623acfb5496fab81, + 0x6f9432865762b8ed, + 0x9b73fc5ba674e85b, + 0xdec139acb358f6c7, + 0xcdb2f35fe49c1835, + 0x2e768d91f28e36a1, + 0xa98f67554392651f, + 0x3a9bdec32f84637b, + 0xf239c5154d5682e7, + 0x1d9762398d7ba165, + 0x1e42c8b8785c9fb1, + 0x2618fd4a975ead2f, + 0x3b159dedc652ed8b, + 0x5e48c91ed354ebf7, + 0x1abe738324691c75, + 0xb8d2f316546b3ad1, + 0xae9f43b8716d394f, + 0x1da7e2698f4157ab, + 0x5e9f6a3cbe548729, + 0xd7a9f82dcd37a695, + 0x54681faedb49a5f1, + 0x9384162fe84cb36f, + 0xed7b65a2174fc2db, + 0x3bf8de765863f149, + 0x86d1f73a986721b5, + 0x2389c15ba5694f13, + 0x6be4d71a914a3d7f, + 0xa31e57998f2d4ceb, + 0x687e52cede317c59, + 0xc21a46b1fd238ac5, + 0xe57238f21d27ba43, + 0xd1784ab43a28b79f, + 0x71cedf26583bc71d, + 0xc9375b19862fe579, + 0x7d8f349cb84316e5, + 0xca65781ed7482563, + 0x4c9fa72ed12843bf, + 0xbfd5a37fef1b623d, + 0xf51d2ec43f2e61a9, + 0x73bc69a54c218ef5, + 0x135a4db76c14ae73, + 0x7f2be18768159bcf, + 0x182bfd4a9718cb4d, + 0xe2f1b3d9851ceab9, + 0xa7bd81fdc51efa27, + 0x7e6d5821f6142a93, + 0xc63914e3241537ef, + 0xfa6182c65219476d, + 0x1279f6843efa65d9, + 0x2dc79a876cfd9547, + 0x1869b5387aef94b3, + 0x249817fcbaf5c431, + 0xc51f4a3cb7f5c18d, + 0x546df1ccb4d6cfe9, + 0x48cd756214dafe57, + 0xcdea28f545fd1ec3, + 0x31f25cd986f25d41, + 0xf2cba69871f34b9d, + 0xd9f5b2698fe76a1b, + 0xce4fbd7a9deb6a87, + 0x9e813a5cbadc98e3, + 0xb8fa4c3fe9dfb861, + 0x67ce5d3218e2c5bd, + 0x98be167328d6e53b, + 0x5abf9e6545d8f3a7, + 0x26efcb8a97ec2415, + 0xe1345cfba5de4381, + 0xf7316b4ba3c251ed, + 0x1b423d7baec36f4b, + 0xa27618b1fdc56eb7, + 0xb49352e21eca9d25, + 0x4d6821e438bdac91, + 0x58b69ad4368ea9fd, + 0x8ab7f46657c2e96b, + 0x2d74e38a95b4f8d7, + 0x58e2913dc6da1945, + 0x1796dbcfe4dc37b1, + 0x3dc6278fe1bd462f, + 0x64be5a2432d1648b, + 0xdeb1cf532eb483f7, + 0xc97eab254ec8a275, + 0xe3f158476cb9a2d1, + 0xcd3275f7678bae3f, + 0xe6fa92d9857fce9b, + 0x632de78dc6a3fd19, + 0x16b24571f4b61d85, + 0xfa37659325a83be1, + 0x21fd69c5429b3a5f, + 0x8f6eabd6519e48cb, + 0xd9e23af76fb17839, + 0x3da64f798eb397a5, + 0xe9daf12dcda8b713, + 0x8eb6a79eda89b47f, + 0x586a2941f67ac3eb, + 0xfd8e43b2178fe259, + 0x928c45b768a412c5, + 0xcfadb65a97b85143, + 0x438e57a762973e8f, + 0xb4a3f7e981794dfb, + 0x46b3c2fbaf7e5d69, + 0xe23978adce718bd5, + 0x98431d21fd84ab53, + 0x9a74d6821c65b8af, + 0x78daec643a69c82d, + 0x1b2d9874375ce689, + 0x95abfd39847de6f5, + 0x178f25adc8a42673, + 0x3a1cf2ecb28634cf, + 0xd91a2fcfe189634d, + 0x159f4dafef5c62b9, + 0xefbc92a43f6e9127, + 0x8576cbe54d61af83, + 0xb3f72ae54a539cdf, + 0x1d953ca87946bc5d, + 0xeb35f4d98647ebc9, + 0xc62913bba65cfb37, + 0x437f95aed56f1ba3, + 0xc386a1d1f6845a21, + 0xe8b6c9a21265487d, + 0xbf712984314856e9, + 0x71e352b54f3c9657, + 0xcfdb54887d4e95c3, + 0x67c934ebad72c541, + 0x67ef1cacba54c29d, + 0xa8392cbed957e21b, + 0x295ef67ed539ef67, + 0x96ad41c3275b1fd3, + 0x3f7869e5476f3e51, + 0x1b8f4ce873524cad, + 0x3a1e7bca91456c2b, + 0xe8752c9baf286b97, + 0xdb71649bad2b89f3, + 0x584e7afedc3eb971, + 0x792b5e31f931b6cd, + 0xf6ed4ab21a23e64b, + 0x289ebd643926f4b7, + 0x4e3a2c99894b1625, + 0x3b81fd5ba75d3491, + 0x43c75aba953e42fd, + 0x9e7ba18ed243716b, + 0x16285dfcbe146fc7, + 0xa154ed21fd189e35, + 0x96a84c743e2b9da1, + 0xfe19ba55492dab1f, + 0x398ec6d65921ea7b, + 0x9e784a176813f9e7, + 0x75ea1f2dc9281a65, + 0x92f84e7ed62a38c1, + 0x52648c3ed51c473f, + 0x1742d9bfe21f459b, + 0x8c592eb764238519, + 0x7e634df32ef4a385, + 0xc763e2f65cf7a3e1, + 0x3e8bd1776ae9b15f, + 0x91ba423656e9cfab, + 0xae75c34986cfde29, + 0x842f953dc7f31e95, + 0x7b38a6ced5e63cf1, + 0xd28f4c7214e83b6f, + 0x92e67d1432fa49db, + 0xf1b37c8651fe6a49, + 0xb95c83d76fe198b5, + 0xc7234b1a9de5b823, + 0x52b3714a9ad6b58f, + 0x9de8cb2ba7d8c4fb, + 0x172839c1f7dce369, + 0x8d9a3c7217bef2d5, + 0xa32bd6f879e64253, + 0x58cfea3875d641af, + 0x6359ad4873c85f1d, + 0xa37962d981db5e79, + 0x425936f98fad7ce5, + 0xae74d51cbed1ac63, + 0x7a8bc13fe8c3a9bf, + 0xd4f27a821ab6c93d, + 0x4763ea8326c8e7a9, + 0x6cd73b9546bcf817, + 0xa573d24a96cf1783, + 0x72468eba96b235df, + 0x82a71f4cb2c7645d, + 0xbf2a6c5fe1d863c9, + 0xb624c35fefbc9237, + 0x6a8d74532fbe91a3, + 0xf491d8e43b819def, + 0x981e57a54a93be6d, + 0x9bf8a7154785ecd9, + 0x7ed1a45986a9fc47, + 0x74e192bba69d1cb3, + 0x496c31aed6af4b31, + 0x3876db11f3b2498d, + 0xb74235a212b457f9, + 0x1f4a9b7431ca9867, + 0xf2e361854f8b96d3, + 0x245abcd87d9eb651, + 0x4e9136c87b81c3ad, + 0xa9fe2b5dca95e32b, + 0x9f72563ed8a6f197, + 0x53bc148fe79a21f3, + 0x81a3cb73279c3f61, + 0xe598b673247f3ebd, + 0x2edb1f8874926d3b, + 0xbd3271c981946ca7, + 0x8f16bdcbaf789b15, + 0xf16e8dca9e6cba81, + 0x1d5963ccb95ca7ed, + 0x896c21a1fa81e75b, + 0xa73de8621a83f5c7, + 0x9dcbea754ba91735, + 0x7ab84f37678b35a1, + 0x37c68baa968c541f, + 0x6df8c54ba38f527b, + 0x4b2e675dc29381e7, + 0xe2f4ab6dce769f45, + 0x473ec121fd579eb1, + 0x6543f7921d59ac2f, + 0x85df71a3294edc8b, + 0x9af2bde54951eaf7, + 0xb31d68fa9a841b75, + 0xc821ef3cb86739d1, + 0x6d781eadc56a384f, + 0xa8d17f9fe25d46ab, + 0xf71bd36fe15f7629, + 0x97eacd243172a495, + 0xcd56b2943e56a4f1, + 0xafd2ec665d48b26f, + 0x5cd7eb976a49c1db, + 0xb312dca8784cdf39, + 0x16b7d83dc9621fa5, + 0x2e68f19ed9764e13, + 0x36b9cd1fe5463c7f, + 0x2ba3496215384aeb, + 0x1e86d2c5423d6b59, + 0x2b3ef757613f79c5, + 0xed5fa2498f52b943, + 0x9c1e4b598d24b69f, + 0x2d7983fbab38c61d, + 0x16b497feda2be479, + 0xa64ef9ced82cf3e5, + 0x3defcab65b712463, + 0x5a9d8c47683542bf, + 0x12dafe6a9748613d, + 0xceb15368732a5f89, + 0x5f7b6d3a912b7df5, + 0x92d645ebae1f9d73, + 0x2c76d3ecbd129acf, + 0x5d1e8a61fb15ca4d, + 0x37fe15932c16e8b9, + 0x1bdc93854a1bf927, + 0x9c7e12a76a2e1893, + 0x6e87df5a982136ef, + 0xa19dfe3cb813456d, + 0x1b74ef6dc31764d9, + 0xd67342cfe21b9347, + 0xe43c268edefc92b3, + 0xb37569254dfeb231, + 0xbfe729143ae1bf7d, + 0x65c13fd548f3cde9, + 0x3e6f219549e6fd57, + 0x93efdc1987f91dc3, + 0xef514b8ba7fd3c41, + 0xcd7f528cb4ef3a9d, + 0x39f6a2bfe4f3691b, + 0xe934f2d212f46987, + 0xd12fe85541f897e3, + 0xcb1985f54fecb761, + 0x12a8467659cea4bd, + 0x5dc37eb98ad1e43b, + 0x3ade547cb9d4f2a7, + 0xf8315bcedae92315, + 0x5ec842a1f7eb4281, + 0x3dfc24e215ba3fcd, + 0xab4d687323cf5e4b, + 0x48a37bf653e26db7, + 0x5d3276c981e69c25, + 0x1837ad276fd7ab91, + 0x4eb239876cb9a8fd, + 0x6eb7543dc9aed86b, + 0xfbca327fe9b1f6d7, + 0xd6f45ec32bd61845, + 0x52ce9a1549d836b1, + 0x23a98db767ca452f, + 0xb3481ad874cd538b, + 0x34db5fca93be62f7, + 0x137a84bdc2d3a175, + 0x35e49f6cbea59fc1, + 0x1b329cdfec97ad3f, + 0xa6bc53921e78cd9b, + 0xb12769543a8dec19, + 0x4fc7e2d76ab21c85, + 0x5b826fe878b53ae1, + 0xb649d25ba6b7395f, + 0xa37b219ed3a947cb, + 0x1abd945fe2bd6739, + 0x13f4798fe1bf86a5, + 0xd734c29652c4b613, + 0x6bfca5732e95b37f, + 0xac1b76354d87c2eb, + 0xcab39d776c8be159, + 0x14d2bf37687cefb5, + 0x31db2a8dc9a14f23, + 0x497d35bdc6943d8f, + 0x5b4c8d9fe3864cfb, + 0xb3e47592138a5c69, + 0xf1ab4d84328c7ad5, + 0x7c31f8d7618f9a53, + 0x2793f1c65e62b7af, + 0xead4218a9e85c72d, + 0x46e5c97cbc67e589, + 0xa51934edc97ae4f5, + 0xb3c26971fa9e1573, + 0xcb4fe193298143cf, + 0x154962b43895624d, + 0x27d6a486548761b9, + 0xb5423fca936a8f17, + 0x23ec745ba16c9e83, + 0x9d3ab6c87c4e8bdf, + 0x614f589bae62cb5d, + 0xb85aec91fb54eac9, + 0x946deb721c58fa37, + 0xe673df954b6c19a3, + 0x2bc9e3176a7e4921, + 0x1cd2845ba981467d, + 0x294ef81cb47365e9, + 0x4b39a1ced2689457, + 0xd89c631fe16a94c3, + 0x9f35d26fef6db341, + 0x1e3f4ad32e4fb19d, + 0x9e571db43b42cef9, + 0xdb6e39765b34fe67, + 0x54fc6b287a581ed3, + 0x4bf2139ba96b3d51, + 0x4c87b13a964e3bad, + 0x1c943dafe7516a2b, + 0xc79ad1b1f2436a97, + 0xda27e842124698f3, + 0xf8624136524ab871, + 0xa378d6c54f2ba5cd, + 0x8b9145f87c2fd54b, + 0xcdea7b1a9c42f3b7, + 0x56a29f1edc681425, + 0x3c6bfd9feb5a4391, + 0xa3d7815fe73a41fd, + 0xd59346f2172d4f5b, + 0xe63d51c545316ec7, + 0xc53a6bd986249d35, + 0x5af327e982369ca1, + 0xfed4c1887e28ba1f, + 0xd9e5bc698e1cd97b, + 0x5a18e4ccba1fd8e7, + 0xbd7162c1fc231965, + 0xf3de7a554b2637c1, + 0xda8f97665a19463f, + 0x4b7c98f7671c549b, + 0x1d4273cba62e7419, + 0xa8fed6bdc631a285, + 0x5b23d47dc435a2e1, + 0x1da6b4fa9cd5ae4f, + 0xf2753eaed9f6ceab, + 0xbd4965821bfaed29, + 0x6e4abc7328edfc95, + 0xb9c832f769e23bf1, + 0xa8fd15e878e43a6f, + 0xc168edfa95f648db, + 0x6135afedc3fb6849, + 0x897b523dc2fd87b5, + 0x53472fbed1efa723, + 0xf47e1d6431e2b48f, + 0xfe456c732ed5c3fb, + 0xa63c21f54cd8e269, + 0x7edc12b769caf1d5, + 0x843dbcfa9ade2153, + 0x3b41f58ba7c13e9f, + 0x3c98f16cb7c45e1d, + 0x57ecb461f3e65d79, + 0xf256bda213d97be5, + 0x3a8217c542ed9b63, + 0x819e273541ce98bf, + 0x75148d276fb2c83d, + 0x9fb6d1487dc4e6a9, + 0x952b7efbabc9f617, + 0x9a45d1ffeadc1683, + 0x2954d68fe7ac24df, + 0xfcd8eba329c1635d, + 0xb245f6a437d462c9, + 0x5bfe397765d89137, + 0xe34587b762ca8f93, + 0xa975f1e7619a8cef, + 0xa5691f287e8fac6d, + 0xc5249f8bac82ebd9, + 0xb9873adfeca5fb47, + 0xdc94ea532dc81ab3, + 0xa3e2f6b659bc4a31, + 0x578f3be546ae378d, + 0x91ceb7d987b156f9, + 0x2ae17cfcb4c39567, + 0x6f9b83ddc2b795d3, + 0xa91726bfe2cab451, + 0xf9d7cbafef7cb2ad, + 0x42e7ba943e8fd12b, + 0xafe97cb43c92ef87, + 0x6cfeb3465b961fe3, + 0xfadb83c87ba93e61, + 0xe27b534986793cbd, + 0xde1749fba68e5c3b, + 0xcf964b2fe4916ba7, + 0xcba69d41f3b49a15, + 0x834bfac323a6b981, + 0xae51f7d43178a6ed, + 0xeaf85c243f7cd65b, + 0x4d8f2bc65b6fe4c7, + 0x98c2d4fcbda41635, + 0x4c1bea8edc9734a1, + 0x432a5cfeda89531f, + 0x541328e1f68c517b, + 0x3b9d46c2146c5fd7, + 0xf1279a4436819e45, + 0x2ef548b763749db1, + 0xe1c2d7998176ab2f, + 0xcbe854d76f47da8b, + 0x295d76b98c4bd9f7, + 0x69a7482dcb4ef975, + 0x3bae9761fb7438d1, + 0xab4963f21b86374f, + 0xa8143c73296845ab, + 0x56d1bf35486c7529, + 0xe159bf3ba46e8395, + 0x15e68d9cb572a3f1, + 0xd53b917dc274b16f, + 0x34f1827a9e35afcb, + 0xb678ed51fc48de39, + 0x3875daf21c3bfda5, + 0x7a389d265b6f2d13, + 0x37492b576a523b7f, + 0x5ebdf898783549eb, + 0xfdb6185dc7386a59, + 0xf7c3a94ed43b78c5, + 0x264f375ed25ea843, + 0x2574fcdfe241b59f, + 0x48e2bcf43264c51d, + 0x985acfd54f26e379, + 0x5e97b1d76c39f2e5, + 0xcad5126a9c5d1263, + 0xda5932e9894e31bf, + 0x917238acb9435f2d, + 0x4ea237ced7245e89, + 0x7c3196dfe4287cf5, + 0xb3ef9272152b9c73, + 0x31e97fd5432d89cf, + 0xd14fe3287231c94d, + 0x2ea9f4776f13e7b9, + 0xb6ef573bad16f827, + 0xb42a657dcd2b1793, + 0x98d15a4dc91b25ef, + 0x4f2da51fe91f346d, + 0xb8c6f7d54a1263d9, + 0xb7613a965a169247, + 0xdae4b938762891b3, + 0x6ae9dfc9853baf21, + 0xa1f697c9821cae7d, + 0xf9a53b276adfbce9, + 0x2cbf6e1babe2fc57, + 0x5dfa314feaf61bc3, + 0x5176c4832cf93b41, + 0x8391ed5327fb389d, + 0x315c6be547fe581b, + 0xc27f8e5ba5f19687, + 0xf317b8cba5f496e3, + 0xfbd1673dc3f8b561, + 0xe524136dc1f8a3bd, + 0xf21376bbafecd23b, + 0x3fcab4e32dcfe1a7, + 0x5e96d2487de63215, + 0x8c94adf65bd63f71, + 0xd816472658b73ecd, + 0x3ebc1fa987ea5d4b, + 0x1a85dc6a94de5cb7, + 0x23456b8ed6e19b25, + 0x196a2e51f3e4ba91, + 0xa95cb72212c5a7fd, + 0xe24b9c5431e9d76b, + 0x9dc416843fabe5d7, + 0x851c69e87cbef645, + 0xda81f7ba9cd435b1, + 0xafe3c95cbac7542f, + 0xfc85426fe7d9528b, + 0x8345c17fe5cb61f7, + 0x8f9d34e214bd8f65, + 0x35c1b29545b29ec1, + 0xcf49213762b4ac3f, + 0x8febd59761a5dc9b, + 0x3721d9e76fa8eb19, + 0xcab81ef87d9cfa85, + 0x643b75edcbaf29e1, + 0x8f24da6feab2385f, + 0xebac23d219a546cb, + 0xf7c9438328ca7639, + 0x8e2d47a436bc84a5, + 0xe31cd96986bea513, + 0x6c3b4a2a94a1b27f, + 0xd4829b6ba294c1eb, + 0x68af2d9cbe86df49, + 0xa384c1eedc78feb5, + 0x78cb2f954d9c1e23, + 0xac5948f43a7e2c8f, + 0x1ae9db2659824afb, + 0xaf249dc878a45b69, + 0xca981f2cb4a879d5, + 0xb8ef275ed48ca953, + 0xd5a7b6edc27d96af, + 0x61b75941f391c62d, + 0xdcba91f321a3e489, + 0x398e16b32d87e3f5, + 0x47189ca76e9b1473, + 0x829bcae76a7b32cf, + 0x61fde58a9a8f514d, + 0x1d52b84dc8725fa9, + 0x3275869ed6958e17, + 0x2d9183e1f4679d83, + 0x872c4f5213598adf, + 0xfbe61d74326eba5d, + 0x126f7b965261e8c9, + 0xeb53fd198e64f937, + 0x678adc9cbe6718a3, + 0x47bf89ddcd7b4821, + 0x5d39fa2fea6c357d, + 0xfbc1634ed86f54e9, + 0xc48a39e21b829357, + 0x1c3d85f5487692c3, + 0x6f57d4e98679b241, + 0xd1ca85276249af8d, + 0xdf6e5318714cbdf9, + 0x4d7e39cbae41fd67, + 0x2d31648cbe651cd3, + 0xc8e4b3d1fd683c51, + 0x8d7b29e21c4839ad, + 0x267afe843a4d592b, + 0x31bd62e54a3f5897, + 0xb8dc62fba85297f3, + 0x17fe93ddc845b671, + 0xa8c4f3dcb237a4cd, + 0xfa38b19fe15ad34b, + 0xd14275edcf3de2b7, + 0xf89a4e776f741325, + 0xead248187e564291, + 0x7d369cb65a263fed, + 0xb98d3c287a294e5b, + 0xb8ad713a982b5dc7, + 0x85c2e37cb72f8c35, + 0xf3c764dfe6439ba1, + 0xc5b7f28fe435b91f, + 0x5a2473921326d87b, + 0x362fde75412ad6e7, + 0x9ed13ba54e1df765, + 0xf824db7a9e4236c1, + 0x2c6e973bac16453f, + 0x5a692f1edc17539b, + 0x56dc413fea2b7319, + 0xe8c23961f72d9185, + 0xa1fe4b84362e8fd1, + 0x1af6c8765612ad4f, + 0x543b81a76314cdab, + 0x9a2475398317ec29, + 0x2a971f476de8fb95, + 0x2e4793a98bec2af1, + 0x2941678cbade296f, + 0x45d961afe9f247db, + 0xfa5d34e21bf56749, + 0x34e1796327f986b5, + 0xc1426a7657fca623, + 0x5d72b38764eda38f, + 0x2c1463d984e1c2fb, + 0x7f865adcb2f4e169, + 0x132f7dea9db6efc5, + 0xb7a4968fecda1f43, + 0xcf5d8a721acb2d9f, + 0xdb47f9a439bf4c1d, + 0x719ead354ae25c79, + 0x4879fad768d47ae5, + 0x7f9a3e4cb5e89a63, + 0xc3de1ba983da97bf, + 0xc247d1eba2ceb73d, + 0x5cd14e31f2d1e5a9, + 0xed8214b432d4f517, + 0x126a7bd54fd91583, + 0x249ef7c65cb923df, + 0x63d4e5287abc425d, + 0x9cd43ea878bf51c9, + 0xec98124cb9c38f27, + 0x93b6a27ed6c58e93, + 0xbce23a6ed3a68bef, + 0x9e5c8b3213c9ab6d, + 0xcae1f8d4328ecad9, + 0x8ab4f59762c1fa47, + 0x28164bc87fc519b3, + 0xef58c62baec84931, + 0xfe647ada9cba368d, + 0xb9365e7ed8ac45f9, + 0xdb856f1fe9bf8467, + 0xa5dbf43218b294d3, + 0xa56ce12548c7b351, + 0x4a23f6b65497b1ad, + 0x1fb789c76389cf1b, + 0x57ae9bc7619cde87, + 0x67e9c23baf921de3, + 0x6735a9fdcea53d61, + 0x74c912b1fc863abd, + 0xac72f5821d895a3b, + 0x9a876ce32b8d59a7, + 0xdb9e365547af8915, + 0x7c526f3a96a3b781, + 0x3db6af5a9384a5ed, + 0x9e32b65dc298d45b, + 0x4cb9375ed18ae3c7, + 0x671a395dce8df235, + 0x41cfdb365f9243a1, + 0x38b7ef954d96521f, + 0x4df2e6743c874f6b, + 0xb167c8254a695ed7, + 0xd782bfcba97c8d45, + 0x49b387fba56f8cb1, + 0xea17f96ed573ba2f, + 0x3e86ca91f264d98b, + 0x39b6d7821256d8f7, + 0xe752f4c4316bf875, + 0x179c8d365f6e27d1, + 0xfb682a4a9d81364f, + 0x6c258baa9d7354ab, + 0x74a5b13edc687429, + 0xf1426cdfea6b8295, + 0x1b34c98fe76c92f1, + 0x863eb4d2164d9e5f, + 0x7fce6a943452aecb, + 0x4b839c287265ed39, + 0xe7ab2c598147fca5, + 0x64ed3caa9f6b2c13, + 0xe563fa4a9c4d2a7f, + 0x4537b6aedc5148eb, + 0xae5cd421fc436859, + 0x79df58621b3687c5, + 0x8f9bed73295ba743, + 0x18dfb346563ca49f, + 0xe9527369865fb41d, + 0x97fe36dcb453e279, + 0x5814f62cb246f1e5, + 0x496f735edf5a2163, + 0x1b6f3eaedc392eaf, + 0xc7264fe21b3c4e2d, + 0x831f52b54c315d89, + 0x4fe1d8b76a237bf5, + 0x59ead6298a269b73, + 0x2743618ba52798cf, + 0x96de78bba52cb84d, + 0x965f3a8dc32fd6b9, + 0xaf253c6fe143f627, + 0xd2fa39e652471693, + 0xd1f98ea65d1824ef, + 0xc39d86a87e1b436d, + 0x2d6eb9487b1e52d9, + 0xd1659f4cbc329147, + 0x36d9b8edc9148fa3, + 0x7a8f941ed837ae21, + 0xaed798c1f418ac7d, + 0xb9ac8413241acbe9, + 0xf2913675431feb57, + 0xc9fd45b985241ac3, + 0xf3241d798ef63a41, + 0x2a1645b98cf6379d, + 0x5b1cdeaa9cfa571b, + 0x56e812ddcafd6587, + 0xad64bf1dc7df85e3, + 0xc197836329f3b461, + 0x6ab412c436f5a2bd, + 0x298b4fe765f8d13b, + 0x763c19f652eadf97, + 0xc83fbae871cbedf3, + 0x3f68becbafd23e71, + 0xb6fc5d7a9ae43bcd, + 0xa125be41fae75c4b, + 0xc35678f21ce95ab7, + 0x84d5cb7439ed8a25, + 0xecf29a3546dfa891, + 0x2dba95c875c2a6fd, + 0xbc4572ea93e4d56b, + 0x2cb6145ba2c8e4d7, + 0x7f325eddc1dbf345, + 0x4c38fabedfce24b1, + 0xfe7c61954ec1532f, + 0xca98fde43ed4518b, + 0x9cb27e443ab65fe7, + 0x586fb2d549ca8e65, + 0xd1a654b876ab8dc1, + 0xa3b9d75985ae9b3f, + 0x54dc27afe4c2da9b, + 0x65418d21f3c5ea19, + 0xc3bead9212c7f985, + 0xc89f4a2653cb28e1, + 0xf791ab254ead275f, + 0xbd8f69a87ea145cb, + 0xbd82c63badc47539, + 0xc731ba9edbc783a5, + 0x64a21cdfe8cba413, + 0xaf9d15cfe59ca17f, + 0x28bf3592147e9fdb, + 0x2da8c76435a2de49, + 0x2ea174576294fdb5, + 0x432e71d984b91d23, + 0xc8479eb76e7a2b8f, + 0x397c4ad98c7d39fb, + 0xa1547c3fedb15a69, + 0x7c5edb21fba378d5, + 0x3e6daf221cb7a853, + 0x4b81dea3267895af, + 0xaf1269d5468cb52d, + 0xefd8a9b7647fd389, + 0x9e18f35ba493e2f5, + 0x68579cbed4b81273, + 0xe16d952cbe7831cf, + 0x642a1f8fec7a4f3d, + 0x4a879b221c6d4ea9, + 0xf15a67c54c928d17, + 0xbc792a465b749c83, + 0x5db12ca5476589df, + 0x82d54f3ba468b95d, + 0xecb7863ba35bd7c9, + 0xea9d16bdc26fe837, + 0xe6c7ba81f29417a3, + 0x18ad6cf653a84721, + 0x5d84f3732f69347d, + 0x6b8d91254d6b53e9, + 0x615fd73a9c6e8257, + 0x2e17968bab7291c3, + 0xa9bd64edc975af31, + 0x4725d9bdc645ae8d, + 0xfd8c3a4fe347bcf9, + 0xc28957f2134bec67, + 0xc12f7565425efad3, + 0xfae5b63a92843b51, + 0x23cedb587f4538ad, + 0x2e83714bae49582b, + 0xcf2e734cbd3c5697, + 0xa2d3b49dca4d86f3, + 0x4576c811fa62b571, + 0xc5fa6e421854a3cd, + 0x5d4af6843857d24b, + 0x7cb2f3d76549e1b7, + 0xb2913d49834bef15, + 0x8cf461dba35e2f81, + 0xf5a6c83a9f423ced, + 0xa723fb4dce264d5b, + 0x2796ced1fd285bc7, + 0xca834bf21d2c8b35, + 0x5ec29a354b3e89a1, + 0xad1c5f776942b81f, + 0xfb36a8ca9823d67b, + 0x2fb634eba426d5e7, + 0x7a519bfdc32af465, + 0xbc7ad18fe34d25c1, + 0x165e2a8dcd1e243f, + 0xdb193c854f13529b, + 0x9278a3c65e367219, + 0x3d5621854c198f75, + 0x94bc12d7692a8ed1, + 0xac639419871d9c4f, + 0x7a523e1a9621dcab, + 0xe23749aed614eb29, + 0xf8ac3b2fe316fa95, + 0x63de7af5453a29f1, + 0xfb29a166531c286f, + 0x36d812954cfe36db, + 0xae5c34298df17649, + 0x7cdf3a4a9cf384b5, + 0x1e6df53dcbf8a523, + 0xe784ba2dc6e9a28f, + 0x5cf6a41ed5eca1fb, + 0x56dcfe2214decf59, + 0xbe5fca8434d2fec5, + 0x7f2b3da985f71e43, + 0x7fe4153761e72c9f, + 0xe38c59d87fea4b1d, + 0x71645ac98cde4b79, + 0xa89e5f6dcbd179e5, + 0xe49ca7d1fbe4a963, + 0xce5d4bf218d596bf, + 0xc6d531e327e9b63d, + 0x41758d2435ecd4a9, + 0x43c9fed985cfe417, + 0x48ea3d2cb6e51483, + 0x378bf12ba1c632df, + 0xa9752e6cbfc9415d, + 0xd8165abfedca4fb9, + 0x92647f821cbd6e27, + 0x2cbd7a854bc18d93, + 0xba3d6e8547b38aef, + 0xfa9715d547c5ba6d, + 0xd8439c1764b7c8d9, + 0x8e1cb7fba3bce947, + 0x731652ddc2aef7b3, + 0xd219bca1f2d54831, + 0xbf674e1321c6358d, + 0xdb36c8732eb854f9, + 0x9e1baf254ebc8367, + 0x3fb128576bae82d3, + 0x1ae3485a9ac3b251, + 0xedc2a97cb683af9d, + 0x638c2f4ed596ce1b, + 0x2a983571f3a9ed87, + 0x86754392148afbe3, + 0x6b3de9c654af2c61, + 0x1ab459c761a239bd, + 0x1de398a87fa6593b, + 0xe9a735176eb958a7, + 0x2538c1fcbdac9815, + 0x931ba84edb9ea681, + 0xceb56171f781a4ed, + 0x28ca9f721894d35b, + 0x62e15f843596e2c7, + 0x6a1ed238769af135, + 0x2bef9d49859d32a1, + 0x73614b99817c2efd, + 0x1cb6897baf824e6b, + 0xce3971acbe845cd7, + 0x4936e171fd798c45, + 0x9a681c532d6c8ab1, + 0xd8e941a4386da92f, + 0xade2cb854961d78b, + 0xc5483a1a9583d6f7, + 0x16fe28dcb398f675, + 0x12fd78adc48a26d1, + 0x375698fed18c254f, + 0xc7b452eede6f43ab, + 0x792c54f21f847329, + 0x7de91c643e768195, + 0x179a25e54b578fe1, + 0xb132e797684a9d5f, + 0xab42f938764e9dcb, + 0xf53e1accb761ec39, + 0x318f6c7ed463fba5, + 0x34b1a971f5782b13, + 0xe42765d2135a297f, + 0x51efac95415c37eb, + 0xcbd4ae776e3f4759, + 0xac54df3a9e4286c5, + 0x7ac38e5cbd57a643, + 0xa6b5d8edcb47a39f, + 0x6158472fe85ab31d, + 0x7be65c91f64ed179, + 0x754d1fc32741efd5, + 0x1de7936548761f53, + 0x2fe3d4b873462daf, + 0xce651df981594c2d, + 0xe93c24b87f2d4c89, + 0x164a23ea9c2e6af5, + 0xfda251bfed429a73, + 0x92613dafea2497cf, + 0xe9bf86c21a28b74d, + 0xbd857c64372ad5b9, + 0x982ed717683de527, + 0x83d921acb8621593, + 0x8593fbeba64523ef, + 0x47d3f28dc138426d, + 0x815e9a4dcf2a51d9, + 0x876a3f9fed1c6f37, + 0xcae9d1832c1f7ea3, + 0x372cf8576c34ad21, + 0x267e3ba65914ab7d, + 0xd24c69865716cae9, + 0xfa76eb3a961bea57, + 0xec6f135ba51df8c3, + 0x53cb147fe7523941, + 0x391a85b1f214369d, + 0xa51d3e754328561b, + 0x6b71acf32efa6487, + 0xbcd384965cfb84e3, + 0xd3fe98587bfea361, + 0xceb85a6878f2a1bd, + 0x361ae84a97e4cf2b, + 0x52f48e9cb4f5de97, + 0x4de9af1cb4d8ecf3, + 0x61a7db2435fc2d71, + 0x1fc8e32543ef2acd, + 0xefb856c871f25a4b, + 0x21c95fe76fe459b7, + 0xca91e5487dea8925, + 0x5a1d93798beca791, + 0xf239d15ba7bc95fd, + 0x62a5ed71f8e1d46b, + 0x98e6f37218c4e3d7, + 0x4f1bc2e437d8f245, + 0x28c564a876ea23b1, + 0xf2a15cd985dc412f, + 0xb5cae21981ce3f7b, + 0xeb7f4dca9fb25de7, + 0xc68fad4cbec48d65, + 0x4592e871fad78bc1, + 0x5deafc3218cb9a3f, + 0xdfce876326aec89b, + 0x74e6f39657c2e819, + 0xf723e16a96c3f785, + 0x2f6384eba5c827e1, + 0x873fda2cb3ca265f, + 0x4af8951fe1ad34cb, + 0x3c74f1bedebf6439, + 0x69c8e3d21fc382a5, + 0x14873da65ec7a213, + 0x7bdfc5243ba79e6f, + 0xcdb6293546789edb, + 0xd162cea8768ecd49, + 0x1598bd4ba691fcb5, + 0xdab9432fe7b61c23, + 0x14f6853fe3b62a8f, + 0xf2acd97212a938fb, + 0xc78bdef431bd4869, + 0x7e8269443e9f67d5, + 0x4c2e51798eb2a753, + 0xb2496ce87c8594af, + 0xb4fa5d7dca98b42d, + 0xf3762b8fe67bd289, + 0x9a416dffe68cd1f5, + 0x86c27fb659b42173, + 0x7e981bc435842ebf, + 0x75cbef9762974e3d, + 0xa438ce9761784da9, + 0x18f2563a9f8d6c17, + 0x1d479b6bad6f7b83, + 0x7a96fb5dcb6298df, + 0x2d98be61fa74b85d, + 0x8abde9f21a57d6c9, + 0xb98de5a3298be637, + 0x1368f9c5467df5a3, + 0x5f3a841cb8a34621, + 0x69af8c7cb295437d, + 0x925ae14dc18752e9, + 0xc7e58fbedf6b8157, + 0x6a2bd18fed5c7fb3, + 0xdb65a9e32c6f9e31, + 0x16d42c943b52ac8d, + 0x198fd5e43854cbf9, + 0xf2be67365948eb67, + 0x3a1256b9865af9d3, + 0x9e63d5fdc67e2a51, + 0x56f4327fe46137ad, + 0x198acb21f184572b, + 0x98574af321486597, + 0xfe6b95c32e4a85f3, + 0x9f3587176e5da471, + 0xa97e12376a4f92cd, + 0xb78de6aa9a63d14b, + 0x28adc9ecb834dfa7, + 0x78d63fadc748fe15, + 0x46e983a1f65b2e81, + 0xaf7e5d32154c2bed, + 0xb6df8ec873614c5b, + 0xd53ae47981435ac7, + 0x17235dfa9f278a35, + 0x1b63ae287e3b98a1, + 0x4b37c81a9b3ca71f, + 0xf782ea5ed92fc57b, + 0xb48237e1f932d4e7, + 0xa9dc84721a27f365, + 0x71ebc4f7685924c1, + 0x4d73be69875b423f, + 0x5ca31d29853e419b, + 0x86c9f72ba2315ef7, + 0x283e41acbf138e75, + 0xc48d21acbe268cd1, + 0x15f9437fec189b4f, + 0x46e9c833281dc9ab, + 0x81ed3b55481fda29, + 0x12a3eb876a12f895, + 0xf5e2986ba93628f1, + 0xc72d543cb519276f, + 0xe43f852dc41a35db, + 0xa53ec82ed21e6549, + 0x4fb31d8dcdef73b5, + 0xe42bda621ef5a423, + 0xb6798ed43ce5a18f, + 0x25dbc91438d69feb, + 0xcfed26a547face59, + 0x2afe546876fbedc5, + 0x8a4f967cb8f21d43, + 0x7fea35ddc5e42b9f, + 0xf47165dfe3f74a1d, + 0x4562dfc212fb4a79, + 0x76d295c431fc68e5, + 0x7583ad654edf9863, + 0x15cfa4276cd295bf, + 0xb35ea7298ae6b53d, + 0x6397ed2cb8e7d3a9, + 0x5d728efdc8dbe317, + 0x5689bfdfe6cdf183, + 0xcd3f586547c231df, + 0xcf719a6326c53f4d, + 0xe396c8b652d64eb9, + 0x6bd74c9981ea6d27, + 0xf1cd29a76fbd7c93, + 0x38e724176bad79ef, + 0xb928a64feac2b96d, + 0x124938b1f8b4c7d9, + 0xec9756a21ac9e847, + 0x1b4a6e9327caf6b3, + 0x85cbd49768ce2731, + 0xb56fe34a96c1348d, + 0x419e2d5ba2c453f9, + 0x6ef9b8adc1d98267, + 0xb1af8e2dcfba81d3, + 0x5fd7268fedac9f41, + 0x54d867921b7f8e9d, + 0x3af1b2754a93cd1b, + 0xb74c689439a4ec87, + 0x6b8f9cd65697fae3, + 0x2df4378a97ac2b61, + 0x427369cba49e28bd, + 0xd128365fe4c1583b, + 0xabd72411f1c356a7, + 0xfc4e5d7432c89715, + 0x482abdc43f9ba581, + 0xfe6718a54c7b93ed, + 0x24def8376a8fc25b, + 0xf4a216798a93e1c7, + 0xe2a9381cb896ef25, + 0x43c27b5ed6a82f91, + 0xb951d67fe4792cfd, + 0x2f695742148e3d6b, + 0x125d3f7543915bd7, + 0xc92b3a4871a38b45, + 0xa631b4c65f7689b1, + 0xf26bc4987d69a82f, + 0xe53bfd7a9a5dc68b, + 0x67145e9cb96ec5f7, + 0x62fab4dfea92f475, + 0x7194b6843a9725d1, + 0x9c461b365789234f, + 0x38d24197657c42ab, + 0xb2138fdba48e6129, + 0x7f23915cb2917f85, + 0xf89eb14baf648de1, + 0x78a52decbd469c5f, + 0x65813ad1fd479acb, + 0x83acd9221a5cdb39, + 0x7f835463284fe9a5, + 0xd6c5a1287b852a13, + 0xf8dc2e1ba965287f, + 0xe25f67dba45836eb, + 0xe9f7bcaed27c4659, + 0x51f69aeed16e74c5, + 0x732df89fef71a543, + 0x8b725c621e54a29f, + 0x23c5eaf54e57b21d, + 0xc19357854b38cf69, + 0x147bf937683aced5, + 0x14c257ea984efd53, + 0xae584cdcb7532caf, + 0xb2a6459fe7564b2d, + 0x526b8d71f2374b89, + 0x3c9f2ea2123b69f5, + 0x9326cb16514e8973, + 0x24cb7fe65e3196cf, + 0xc96ab4198e23b64d, + 0x3b976a298c26d4b9, + 0x7a35169dcb3ae427, + 0x4ec1296ed84cf293, + 0xae21834dc74d12ef, + 0x3fc9ead32953416d, + 0x29cbf86436254fc9, + 0x6d251cb984296e37, + 0xe59436f9812b7da3, + 0x7c914d598f3e9c21, + 0x85d746fa9e21ba7d, + 0xbcf3567edb13c8e9, + 0x16dca971fb16e957, + 0xbd9ae4f32a19f7c3, + 0xf92adce76a3d2841, + 0x8d5b9327671f259d, + 0x7b1846dba823651b, + 0xd14673bdc4156387, + 0x647b13adc41982e3, + 0xd28f46adcefba261, + 0xafb176ddc9eb8fad, + 0xc83def5219dfae2b, + 0xc168db943af2ed97, + 0x21c936f548d5ebf3, + 0x54b9238768f92c71, + 0x2ba4e6f875fa29cd, + 0x6871bf9ba5fe394b, + 0x43612bfed3f158b7, + 0x26134f7fe1f49825, + 0xfdec978432f7a691, + 0x371ad9c32ec894fd, + 0xc12e97554aedc36b, + 0x8c16742659bfc2d7, + 0xc472d1ea9ad3f145, + 0x9e7385ddc9e732b1, + 0x76d1a28cb6c83e1f, + 0x2aec5171f4da3e7b, + 0x9d7f8eb213bd4ce7, + 0xbe5263d543e18c65, + 0x32a5974762e48ac1, + 0xfc6d31a65ec6a93f, + 0x94ce23f65ed8c79b, + 0xf6e975498abcd719, + 0xfb7e619dc9bfe685, + 0x98572b61f9c426e1, + 0x6bed532219c7245f, + 0x6375fbe326d843cb, + 0xa4f69d1875dc6239, + 0x6b2f7ea983ce71a5, + 0xfa3b4c2a93b28ef1, + 0x4eac5d998ea39d6f, + 0xde8b65cbae859cdb, + 0xae1b8521fba8dc49, + 0xbe376d92198ceab5, + 0x39d187e5489efa23, + 0x38cd4f9657b3298f, + 0x4abc637986a537fb, + 0x9e34d58cb3ca4769, + 0xa78b62fdc2ab76d5, + 0x1b28c53ed1be9653, + 0x725e1bcede8193af, + 0x2a8657421f95b32d, + 0xf4d51c643ea6d189, + 0xe81c76443a78cfe5, + 0xbfe6c416598bfe63, + 0xa15d97b9867e1dbf, + 0x136c5afcb7924c3d, + 0x23fad49fe3854ca9, + 0x76823cd1f3a96b17, + 0x84f3d562129c7a83, + 0xb4c9f584316c87df, + 0xb9f56d354f81b75d, + 0xda3859476e73d5c9, + 0x9ce642dbac98e537, + 0xdb2fe96dcb79f4a3, + 0xfd32ca7fea9d3521, + 0xd254c67fe68f327d, + 0xd7abe983278351e9, + 0x9d1c3ea323956f47, + 0x486e21c652687eb3, + 0xea341679827b9d31, + 0x3127f9c76f4e9b8d, + 0x4bfe91598d51caf9, + 0x3e58726edc53ea67, + 0x7531f94fea56f8d3, + 0xc46e59d43c7b2951, + 0xe8a19644385c26ad, + 0x8eb3f4d6587f462b, + 0xe79c561cb5826497, + 0xedf7a5ccb27684f3, + 0x3854efbed269a371, + 0x3ac2516cbf4a91cd, + 0xfc361b9fec4daf3b, + 0x6791ad332c41dea7, + 0xdae976843b64fd15, + 0x27f8be576b572d81, + 0xf3429e8767482aed, + 0xf12e4cda974d3a5b, + 0xe5f1c47cb53f49c7, + 0xf74b628fe4628935, + 0x1bd74321f24597a1, + 0x1cae49f43248a61f, + 0x54c172643f2ac47b, + 0x2fd8a1e65b2dc3e7, + 0xdb7af14a9c41f265, + 0x7b51e86bab5623c1, + 0x95f62e8dca58413f, + 0xa8c9734ed6293f8b, + 0x893276cfe52b4df7, + 0x59b673a2142f6d75, + 0x8d759ea765438bd1, + 0x196edba871259a4f, + 0x632987465f16c8ab, + 0xf849e1c87e1bd829, + 0x71932e6bab1de795, + 0x9f715a2edb4327f1, + 0xbaf7168fea14256f, + 0xe4c5f163291734db, + 0x1e3a97b6581b6349, + 0x12c9ba79861d72b5, + 0x41cdef7ba64f9123, + 0xd4271ecba3129e7f, + 0x5ceb64387cf39deb, + 0x281569fbabf6cd59, + 0x3a7124bed9f8ebc5, + 0x46dc2e5219ecfb43, + 0xdeb2698437de1a9f, + 0x5c1a978768f3491d, + 0xec624b7ba6f54879, + 0xc2d6745ba3f967e5, + 0xa5d3f6ecb2fc9763, + 0x895f7d2ba1ed84bf, + 0x49ba1f6dcfe1b43d, + 0xac5836b21fe4d2a9, + 0xc8faeb654cd8e217, + 0x15fce7254ac9ef73, + 0x4ef7a2d657ba1ecf, + 0x3d7154a987bf2e4d, + 0x5bdf632ba6e24db9, + 0x9bf41c6ed4e56c27, + 0xbc5a6381f2e87b93, + 0xd297e4c212ca78ef, + 0xa7148cd431cea86d, + 0x7189ec654fb1c6d9, + 0x49523f698dc3e647, + 0xef2679a98ac7f5b3, + 0xa37ed95dcadb2631, + 0x4c5d92bfe7bc238d, + 0x7ef2c65ed6be42f9, + 0x6f81a4d329d38167, + 0xef16783324b57fc3, + 0xc49e7fb763c89e41, + 0xe2a6df9651ba8c9d, + 0x9bc3d5a76f8eac1b, + 0x27f5bd4a9da1eb87, + 0x469385ddcba4f9e3, + 0x85369711fbc82a61, + 0xda5ef3c218a927bd, + 0xf1d359a328ad473b, + 0x624ed71436bf45a7, + 0x67c98deba7c39615, + 0x6c3d47fcb3c6a481, + 0xa678493cb1a792ed, + 0xebf491aedf8ac15b, + 0x981423ffea6dcfb7, + 0x7db25fc43c91fe25, + 0x1e9b3af54ca52e91, + 0xc5af61e549862bfd, + 0xc8d31ef657893c6b, + 0xc6df84ea958c4ad7, + 0x613279ddc39f7a45, + 0x8fa6c15fe4a398b1, + 0x54196f8fe195a72f, + 0xad6435c32197c58b, + 0x3a68c5e32e6ac4f7, + 0x791523f54c8de375, + 0x5a73c2998c9324d1, + 0xe183cf7bab96324f, + 0xb7e16a4ed98741ab, + 0x15a43c9ed67a5f19, + 0xea426c91f37c6e85, + 0x4ba63853246f7ce1, + 0x1ced2ba543729b5f, + 0x34e2a8965164a9cb, + 0xf38eb4a76f57da39, + 0xf41d8eb87d4be8a5, + 0x716df45bab6df813, + 0x3684eb9edb81267f, + 0x8c752ba1f97435eb, + 0x3ec6f4221b786459, + 0x147f3583286a73c5, + 0x9aed12b9867d9243, + 0xa56bf988735e819f, + 0x731fe5c981529efb, + 0xeb74cf9baf34ce69, + 0xb31d6c8bab37ecd5, + 0x91d485ffeb4afc53, + 0x8ab735f3294d1baf, + 0x19ed63765b614a2d, + 0xf943b7276b534a89, + 0xbf9d854ba93768f5, + 0x9ae574bdc54b9873, + 0xf3e9162ba23b85cf, + 0xa162d57dc13fa54d, + 0xb95a184fef42d3b9, + 0xe32749c21f46e327, + 0x4a6fc2e65d48f193, + 0x43895a776b4a21ef, + 0xaef9b148793c2f5d, + 0x7c3e465ba8314ec9, + 0x7a541dbdc9246d37, + 0x8b1ad7cfe5267ca3, + 0x8eab3591f54a9b21, + 0xa926ed32132ca97d, + 0xfc935db5412fb7e9, + 0x83dae1276f12e857, + 0x5e946cb98d15f6c3, + 0x264fe97cbd3a2741, + 0xb16ef39dca1b249d, + 0x564f2ceed92e541b, + 0x5846aed1fa316287, + 0x8cbfa7e5492581e3, + 0x37afd98546279f51, + 0x4dc3a8b653178ead, + 0xc8a1e5f8731cad2b, + 0xce47fb265bfedc97, + 0x7a321de98bd1eaf3, + 0xfac4eb1edcf52b71, + 0xda65192fe9f628cd, + 0xdae89b7219fa384b, + 0xd1567a3328fd46b7, + 0xa3961cf546ef8725, + 0xa37195f986f3a591, + 0x9e3f2a6982e593fd, + 0x2ed5fb4ba1f8c26b, + 0x276c154a9feac1d7, + 0x267f51cfeabcdf35, + 0xef76a8954cd32fa1, + 0x7cf19a354ac53d1f, + 0x2f38ad6549e63d7b, + 0xb964a7f656d94be7, + 0xc6a3271a94ed7b65, + 0x31647cdba4df79c1, + 0x9d68e32dc4d2a83f, + 0x2647a3c1f1e4c69b, + 0x7df581a432e8d619, + 0x496f3c532fcbe485, + 0x6cef79a65bacf4e1, + 0xf517c6298bc1235f, + 0x729536a989d542cb, + 0xe52936adcad86139, + 0x2fbe154ed4ca6f95, + 0x12a9745fe4ab7df1, + 0x874cd93213ae8c6f, + 0xd9eb278543c29adb, + 0xe21f37d761c5db49, + 0xc892d5654fa7e9b5, + 0x46189eb87dabf923, + 0xa4b1732a9bad178f, + 0x546ca7bed9a136fb, + 0xc1792db1fac34569, + 0xb6a5d84219b874d5, + 0xef7c9b4327cb9453, + 0x3df719c6549c82af, + 0xf8ca63e8749fa12d, + 0x5bd2ce6981a2cf79, + 0xd4f8a23a9f84cde5, + 0xd931c6fcbc98fd63, + 0xf871d92fea791cbf, + 0xbd5c9f421a8e2b3d, + 0x2c7f64e43c814ba9, + 0xa13b72e659b46a17, + 0x48257c6ba5b67983, + 0xd17fe45ba37986df, + 0xd5684a3cb28ca65d, + 0x1386297ed17fb4c9, + 0xc9e2b47edf92e437, + 0x5d3ef8a21e86f2a3, + 0x83759e176e9a3421, + 0x961cbe765c8b317d, + 0x83dae1f6586c3fd9, + 0x4a98fe6cba916e47, + 0x2a1e459dc6847db3, + 0xa8132c7fe5879c31, + 0x213e57b1f2579a8d, + 0x83ba9d72125cb8f9, + 0x5a1768c4315fd967, + 0xa2b7d6f65e62f7d3, + 0x64e8712bae972851, + 0x163fdcaa9c6825ad, + 0xc48f25eeda7c452b, + 0x3b895caeda6e5397, + 0x4d5c6fafe97182f3, + 0xb8c1ea943985a271, + 0x73ce5bf323458fbd, + 0x94351e876258ae3b, + 0x4a5cd287614bcda7, + 0x6f15cb398d4fec15, + 0x614e3a2cbe642c81, + 0x274b35edcb4529ed, + 0xe84db361fc48395b, + 0xc98ad7621a3b48c7, + 0x456891b32a4e7835, + 0x1368bc28785296a1, + 0x62bfa78a9764a51f, + 0x7e8c642ba246c37b, + 0x71d9a3ecb149c2e7, + 0xe61d85ccbf3ce165, + 0xb683a9fdca3defb1, + 0xb93875621c543e2f, + 0x67dfb1254c253e8b, + 0x7c914df65a284cf7, + 0xe2df5739892b6c75, + 0x476bfe5a963e7ad1, + 0x7e15a2bdc631a94f, + 0xb2f3dc6fe423c7ab, + 0x395cab71f136d729, + 0xcd125894312ae695, + 0x5fe7a9d54d2be5f1, + 0x4dfc5e287c2e146f, + 0x52e6cf198c1243db, + 0x472a3fccbc176249, + 0x375219aeda2971b5, + 0xf248b37ed72b8f13, + 0x6431f52fe41c8d7f, + 0xa6c7158435219ceb, + 0xd14728576413dc59, + 0xd1b52cf87216eac5, + 0x4e28c7a76de8fa43, + 0xafd285176ceb189f, + 0xe4b5ac8a9afe381d, + 0xc731e48edbf14679, + 0x13f9b54ed9f376e5, + 0x94df85621af89563, + 0xd8a5e9b325e983bf, + 0x137c92e765fca23d, + 0xd7a913e763efc1a9, + 0x47b2c6a981d2cef5, + 0x2d8cb31a9dc5fe73, + 0xba1583ca9ab71dcf, + 0xeba84c31f9ea2c4d, + 0xa65bf97218de3cb9, + 0xba7385f54ae16b27, + 0x89b41ca658e47a93, + 0x297fba5764c587ef, + 0xc6da132983e9a76d, + 0x4ab7259982ecb5d9, + 0xde6ac39cb1cfd547, + 0x3b15a94edec2f4b3, + 0x7c69e5b54fd82531, + 0x7b63ec854ec9328d, + 0xac8496265acb41f9, + 0x92dfe83769bd4f57, + 0x6875ceda98b17ec3, + 0xd178f64cb7c59d41, + 0xb16d42cfe3c58b9d, + 0x8d5cbe41f3d8ca1b, + 0x4efd2ba212bcda87, + 0x2bd189a541afd8e3, + 0xa1b2e9487fc42961, + 0xce9245187ea526bd, + 0xf4a197d98dc9463b, + 0x18732a9ed9bc54a7, + 0x78f241bed9be8415, + 0xa2b38571f7c2a381, + 0xdcf5948326a491ed, + 0x8ac15f632396af4b, + 0x279ad3154298ceb7, + 0x32519fd8719bed25, + 0xe25f47a76d7efc91, + 0x15c47dea9c832afd, + 0x6c2d917fed953a6b, + 0x7a328ed1fba849d7, + 0x493e7f221bac7945, + 0x7da14824369e87b1, + 0x2b7a4fd65791a62f, + 0x984b31e87593c48b, + 0xfe9cb76ba296c3f7, + 0x4bf372edc19ae275, + 0x732dc81bae7bf2d1, + 0x4bfe625edc8e214f, + 0x245a8c921d723f9b, + 0x1c6df5b43c865e19, + 0x2cf419b43b796d85, + 0xf3da8676586a7be1, + 0xf21d568a946d8a5f, + 0x9461f75ed461a8cb, + 0x2c13b4ffe274d839, + 0x52b8c961f186e7a5, + 0x19d57cb5428af713, + 0x16baed543e6c157f, + 0x8afc3d765c6f24eb, + 0x28f3e9bbad826359, + 0x7b15d2ebab8672c5, + 0x7f58361edb7a9143, + 0x93f528bdc54a7e8f, + 0x94d65b1fe34c8dfb, + 0xa469ed532451cd69, + 0xb5376c254263ebd5, + 0x2caefd998167fb53, + 0xd94ca7276e4819af, + 0xdba256e98e5c392d, + 0x416ea25cbc4f3789, + 0xe1a546bedb4267f5, + 0xe64c1b51fb459673, + 0x8e74ba62193784cf, + 0x5c8eba33275ba34d, + 0xceb19d57654ec2b9, + 0x89631e4ba563e127, + 0x341f8c5ba154ef83, + 0x2caed75a9c361edf, + 0xa49786fcbc392e5d, + 0x5479c381fa2b3dc9, + 0xaed8b4921b2f5c37, + 0x916a2b365c427ba3, + 0xafe3b4187b469a21, + 0xf62b8e5a9526a87d, + 0xe9d42519842ab6e9, + 0x95af23ccb32ed657, + 0x19a8647ed241f5c3, + 0x4a321bffef372641, + 0xe7d2f1654f17239d, + 0x2e74c3b76e2a531b, + 0x275a1de76c2d5187, + 0xd34be858791e6fd3, + 0x7a8e6f4cba239e51, + 0xa31927fcb6148cad, + 0xdc89af2fe517ac2b, + 0x718eb2d1f31adb97, + 0xa65d9483241cd9f3, + 0x25d4f91985432a71, + 0x67a93fd65ef327cd, + 0xf3e4b1998df6374b, + 0xb4e961798cf945b7, + 0x54f7826cbafc8625, + 0xf3e79dbdc7fe8491, + 0x72dafebdc6e192fd, + 0x9fa857e327f4c16b, + 0x5d3e7bc323e5bfc7, + 0x9135def762f9de35, + 0x2c1f95a762ebfda1, + 0xbd9456287dbe2c1f, + 0x5462acfa9de23c7b, + 0x81479f5dcbd54ae7, + 0x3bce2d71fbe97a65, + 0x493f6dc329eb78c1, + 0xb1f3654326cd973f, + 0xc2aed5f546e1c59b, + 0x1b92ef5986e4d519, + 0x57c98b2ba2d7e385, + 0x95637ecba2c9f3e1, + 0x64cd83ebaebc125f, + 0x26c951afedaf31cb, + 0x8eaf35721dc35f29, + 0xb4ac87f32bc46e95, + 0x128defa549b87cf1, + 0xcf1e873545ca8b6f, + 0xaf195d3764ae89db, + 0xa35d162cb5c1da49, + 0x54b9286ed2c3e8b5, + 0x9478231fe1c7f823, + 0xc86a94d432ca168f, + 0xe2b4dfc43e9c25fb, + 0xd2cf31865dbf3469, + 0x2a3bc9f98cb273d5, + 0xf73c2d8babc79253, + 0xa728513dc6b781af, + 0xa47516ddc58a9f1d, + 0x5938da41f38dbe79, + 0xdb3a8e132491dce5, + 0xfd3e9b4652a4fc63, + 0x247ad36652961abf, + 0x3bcea4976f892a3d, + 0x8aec97476e7d38a9, + 0x15c6de2cbcaf5917, + 0x68b14fdfecb29783, + 0x56db87afe79485df, + 0xf7da8e621798a45d, + 0x1d9bfe53257ab3c9, + 0xbc1d4f97659ed237, + 0x723cb5d98592f1a3, + 0x8135de2dc5b74321, + 0xb8cd72fbae872f6d, + 0x3a9c426cbc683ed9, + 0x614ba851fb8c5d47, + 0x9e542da21a7f6cb3, + 0x3498bfc65c849b31, + 0xe7641c243764a98d, + 0xe6fbc2a98456b7f9, + 0xce163b9ba35bd867, + 0x2645c71ba27ce6d3, + 0x64acf53fe4a32751, + 0xb25c14ffef7524ad, + 0xa297f3c21f78542b, + 0x6ef5a9143e6b5297, + 0x8f3e61a65b6c71f3, + 0x68af39b87a5e8f61, + 0xfa187d3a97528ebd, + 0x4f2657ddc765ad3b, + 0x79fb46afe346dca7, + 0x825173e1f36aeb15, + 0xa1c489b3235dfa81, + 0x61a734f6536128ed, + 0xe51cdb687f64385b, + 0x5d6f4baa9e3846c7, + 0x14b3ec9bad4b8735, + 0xe435f92dcb4d85a1, + 0x34f2e95dc85e941f, + 0xd142be81f853c27b, + 0x91dea4532845c1e7, + 0x5a376e932638df45, + 0xc2f9d7576349feb1, + 0x5917c4e9835c1d2f, + 0xef17c62a9f413d8b, + 0xb64e1fcbad234bf7, + 0xdf14596fed286b75, + 0xbac58671fb3a79d1, + 0xd8c927621a2c984f, + 0xd418ec24372f96ab, + 0x5e6cf3987843d629, + 0xf59be6dba726e495, + 0x174d6cfba538e4f1, + 0x1dfeba5dc24b136f, + 0xb68e729baf1e32db, + 0x9c13de51fe326149, + 0xca78d1432d136fa5, + 0x614739865c278e13, + 0x8da691c54a198c7f, + 0x2d6b8736561c8aeb, + 0x61bf4ec9861fcb59, + 0xc571ae2cb612e9c5, + 0xa745639ed516f943, + 0xcfb87a1fe328179f, + 0xad247bc6542b371d, + 0x4fe3c6132efd3579, + 0x471e68943bdf64e5, + 0xb6afe4d98cf29463, + 0x6b5dea4879e582bf, + 0xc623e5fcb7f8a13d, + 0xf461dbadc4eabf89, + 0x296bdc1ba3ecbdf5, + 0x1c698af325e1fd73, + 0x468ace2653e41bcf, + 0x32b14da761f72b4d, + 0xae42bd665fe83ab9, + 0x3af5c2798ced5a27, + 0x21e6c78babdf6893, + 0x397aec4cb9c286ef, + 0x619a7381f8e4a56d, + 0xcfa2be4216e7b4d9, + 0xde95a7c326ebd347, + 0x945fcd3765cde2b3, + 0xd9685f2ba7e52431, + 0xec29b18ba2e5318d, + 0xc2d196498db63fe9, + 0x136c592cbdca4e57, + 0xc7521631f9ab6dc3, + 0x3e7a5d432abf8c41, + 0x6a72ce8437c28a9d, + 0x87eb1d5547d5c91b, + 0xae612bd654c6d987, + 0x45ea96d984bad7e3, + 0x1bc67e5ba3bdf761, + 0xf8c2b97fe3c125bd, + 0x39a6b5ffefc6453b, + 0xa57463c21fc853a7, + 0x53afe2854ecb8315, + 0x9268bce65cbd9281, + 0x9c7ed265468e7fcd, + 0x2eca15d98792ae4b, + 0x618324bba594cdb7, + 0xc84e9b1ed4a8ec25, + 0xa416357fe38afb91, + 0x1879ec33238c19fd, + 0x2caf1d8652c1396b, + 0xa4bfd8e65fa348d7, + 0xe389adb76eb97845, + 0x9a2de8b87d9a86b1, + 0xf91e36acba8c952f, + 0xf46592bed67fa38b, + 0xa19cdb2fe693c2f7, + 0x719e6a8328a6e175, + 0x168fe4743487efc1, + 0x9ea25717648a1e3f, + 0xb4a39df7617d2e9b, + 0x24ed5c1baf825d19, + 0xc3de841cbe936c85, + 0x8f29e4cedc867ae1, + 0x47289cafeb6a895f, + 0x5c9f38b2185d97cb, + 0x6dc75e83286fc739, + 0x71856fb54782e6a5, + 0xdbf1c83ba597f613, + 0x273dea6cb389147f, + 0x372e194dc17a23eb, + 0xf7db36adcf7e4259, + 0xcd6a28b1fe8271c5, + 0xc4ea9b821d758f23, + 0x816df4332b457d8f, + 0x568e94a439478cfb, + 0xcb98a3f6574dbc69, + 0xed5a1679864fcad5, + 0x89df27edc672fa53, + 0xa839c2fed36518af, + 0x72ac8561f169382d, + 0xaf4cde13215c3689, + 0xf389c4a32e3d46f5, + 0x45d6fa298e619573, + 0x9a256fb87b5483cf, + 0x387acfba9b57a24d, + 0x8937ec6ed748c1b9, + 0x12ab75ced64bcf17, + 0x7d46a23dc54fde83, + 0x143d5fc326531cdf, + 0x1a8eb94873462c5d, + 0x92cd578761473bc9, + 0x64f9ae398f2c5b37, + 0x6c92e7498d2e69a3, + 0xef58374dcd53a921, + 0x4f35bd7feb23a67d, + 0x2ad7ec91f826b5e9, + 0x84e7f5c2192ad457, + 0xf4cb63d6572be4c3, + 0x1cb2e479875ef341, + 0xd5b7213ba654329d, + 0x41f5326dc347521b, + 0x53d7c92cbe194f67, + 0x68f13c2cbc1a6ed3, + 0x83db25a1fb2e8d51, + 0xb7a45e943c218bad, + 0x7621ae465914ca2b, + 0x6f3ec1d54815da97, + 0xf24183a87619d8f3, + 0xb92e645ba52cf871, + 0xbc8213fba42f16cd, + 0xb17493cfe512364b, + 0x4379b26edef354b7, + 0x3bac7ef21ef98425, + 0xd956a2c54dfb8391, + 0x138d2ab549eb81fd, + 0x6aecb93547de9f5b, + 0xc45129e986f2bec7, + 0xfb9714eba7f6ed35, + 0x3526df9cb4e7fca1, + 0x54c78e2ed4ea2b1f, + 0x8c9546e213fe2a7b, + 0x43d6b1f652f149e7, + 0x5b38a7654fe37965, + 0xb2ed8af65de687c1, + 0x5c42e9187bda963f, + 0xb2f65a7987eda49b, + 0xa892e63cb7dfc419, + 0x9752ed11f7d3e285, + 0xce859ab437c6f2e1, + 0x63582f1546d9215f, + 0x8eab671653d92fab, + 0xb86dfa9871cd4e29, + 0x7a34e9698fc16d95, + 0xae18dcba9dc47bf1, + 0x7968fa4edbc58a6f, + 0x21db5c81f6c798db, + 0x8da4eb7217bdc849, + 0xba38cd1326afd7b5, + 0x8dfc953768c4f723, + 0x81b6437a94c6158f, + 0x1a6f258a93c824fb, + 0x5c1d83acb1dc4369, + 0x8cd13f7cbfae62d5, + 0x62974ec1fec29153, + 0xde3579421ca37e9f, + 0x94dc8fa43ba69e1d, + 0xe6af825436a8bd79, + 0x21fa5685468acbe5, + 0x2c45e6b9859feb63, + 0x753e628dc5a319bf, + 0x97a2bc8fe4b6293d, + 0x728ac1e1f1c837a9, + 0xa64d951432bc5817, + 0xf4e8c9532fae7683, + 0x8f79ed165c9184df, + 0xf6c823987c94a35d, + 0x265be9187a86b2c9, + 0x86593f2dc89ad137, + 0x6feb482dc57bdf93, + 0xf8d25c1ba36bdcef, + 0x3958f26215932e6d, + 0x8f59e67542853cd9, + 0x59271ba761a95c47, + 0x371ace465f7c6ab3, + 0xb5718dca9d7e8a31, + 0x6ed9a78cbc61a78d, + 0x6215fb8eda73b6f9, + 0x2a468de1fa98d567, + 0xc92b3af21879e5d3, + 0xcd1e2794378cf451, + 0x2eab4d37657f13ad, + 0x8e24b35ba694532b, + 0xbd357e1dc2a65197, + 0xf2cd9e4bad586fe3, + 0x543a9efdcd5b8e61, + 0xe16db591f94e7cbd, + 0x957a4de32d61ac3b, + 0x3fa845932953dba7, + 0x13f956854967ea15, + 0x8dc6f2e8765af981, + 0xb4563c8a945b17ed, + 0x4a857b3dc36f275b, + 0x3d46821fe18245c7, + 0xfc147dafef478635, + 0xa3dfe5632f5984a1, + 0x97dc3f654d5b931f, + 0x2c8b4e665c4ea17b, + 0x372519476941bfd7, + 0x1c7b652ba963de45, + 0x6849d3cba746fdb1, + 0x431bc7fed6591c2f, + 0xb25d39e1f34d2c8b, + 0xb7ac49e2124e3af7, + 0x25ed73f981426a75, + 0x759ae1b76f3578d1, + 0x9c1f2d576d28974f, + 0xf1d56e387d2c95ab, + 0xec78935cba3ec529, + 0x4a2687ceda41e395, + 0x6a179e2ed845e3f1, + 0x1ebfc2943948126f, + 0x2dc34a16564931db, + 0x94fcabe8752c4f39, + 0xe1bda499812f4ea5, + 0x756ebc8baf248d13, + 0x1395e8cbad148b7f, + 0xb52e638edc1689eb, + 0xb4cd6a21f81bca59, + 0x3791ab43291ed8c5, + 0x937fbdc76a21f843, + 0x4fc3e9d87824169f, + 0x327c4fbba728361d, + 0xd5f8b17dc51b3479, + 0x6ae29d1cb21c63e5, + 0xcf1425ecbdfe8263, + 0xa74c2f1edce281bf, + 0x728bf4921be49f2d, + 0xb7f68dc32af5be89, + 0x542e8a1437e8bcf5, + 0xc3f42d8656fbec73, + 0xa3c5e24764bde9cf, + 0x83a176ecb6f32a4d, + 0x6b15497ed2f538b9, + 0x2519f38fe1fa5927, + 0x398bf16321fc6793, + 0xc8f39e432dbc75ef, + 0x129dab365ce1a46d, + 0xb2afc7976ae4b3d9, + 0xd562437a9ae8d247, + 0xdecf7b3ba7d9e1b3, + 0x4b87d31ba6cbef21, + 0xb28fe54dc4be1f7d, + 0x7945c3b215c23de9, + 0xd8a41e6432e64d57, + 0x7cd34b2651e86bc3, + 0x14f289b76fdc8b41, + 0xbf73ea865cbe789d, + 0x61e28fba9ad2c81b, + 0xd586321feac3d687, + 0x7b8ec351f8b7d6e3, + 0x7359a8d328caf561, + 0xec975b2436ac14bd, + 0x18c639b876cf243b, + 0x287ae53a94d352a7, + 0x57942d3cb3d78215, + 0x9d1427bbaeb98f71, + 0xf23791cbab897ecd, + 0xdb798261fa8e9d4b, + 0x6389c7f32a91dcb7, + 0xc425a1e439a4eb25, + 0x95f6721547b6fa91, + 0xce3dfb4765a918fd, + 0x15cd84ba94ad286b, + 0xdc172aecb2af36d7, + 0x4a2985cfe1c28745, + 0xc6d7b82fefa685b1, + 0xcd87be921ea8942f, + 0xb4d268143e7ca28b, + 0x1a9c2e654a8db1f7, + 0xc631f9887a91df65, + 0x16afd4ca9784fec1, + 0x5c48d7acb6971d3f, + 0xfa49b71fe4782d9b, + 0x5c8d76e1f38d4c19, + 0x2943ce82129f4b85, + 0x47dfcbe652a379e1, + 0xe98c5b743e74985f, + 0x692eb8554e5796cb, + 0x6fe2cb998d7bc639, + 0xde51a98cb97ed4a5, + 0xfbca549eda92f513, + 0x74b8a19fe895137f, + 0xd4f67282168732eb, + 0xa512fb94368b4159, + 0xd35ae497627c4fb5, + 0xaebd763a918f7e23, + 0x6da5bf8a9e527c8f, + 0xfc6b2e5a9d548afb, + 0x5a7c483fed47cb69, + 0xb28c1761f84ac9d5, + 0x2fc874521a6de953, + 0xe35ba865496217af, + 0xae7c95876985372d, + 0xf75286ccb4673589, + 0xfd2a163cb27a64f5, + 0x2eb87f6dc16d8473, + 0x693eb8fbad4e72cf, + 0x3a287141fe63a14d, + 0x8fc35d221d34bfa9, + 0x276ae4c43b48ce17, + 0x12fc8b66594aed83, + 0x7de39a16563beadf, + 0xc7685b3ba8612b5d, + 0x69a54f3ed6543ac9, + 0x3c52419fe2485a37, + 0x6d2957e1f14b68a3, + 0x18ab3525435d9821, + 0xb914f8543e2f957d, + 0x5ab19fd76d32b4e9, + 0x462f5bda9c26d357, + 0xb43625aa9a48e2c3, + 0x4296dbedc95bf241, + 0x79ef41bdc74e219d, + 0x95aef4ced6413ef9, + 0xec7a58f218234e67, + 0xa3bdf64654276cd3, + 0x2b8da358723a8c51, + 0x7dc9b1a65f1c79ad, + 0x86b5a3287d1fa92b, + 0xfe45823cbc12d897, + 0xab7f368dca15d7f3, + 0xac5f3b8fea29f671, + 0xfda1e724382a15cd, + 0x3f514ae7681e254b, + 0x2dc5a1ba982153b7, + 0x5813749cb7168325, + 0xe28461fdc4378291, + 0x79142dc98bc67fed, + 0x94e1c3798cfa9e5b, + 0x496dcfecb8feadc7, + 0xfb58d6432af1ec35, + 0xba947f8438e4fba1, + 0xea9b48d658e72a1f, + 0x5b4831c765fa297b, + 0x5fe4682a94fc38e7, + 0x9341825cb2ef4865, + 0x4a73526ed2f386c1, + 0x5fad49bdced6953f, + 0xbd7e52421fe7a39b, + 0xc729f1a54debc319, + 0x2cae98f54aced185, + 0x9d7a31c768b2efd1, + 0xb14a8eca98c51e4f, + 0xb7f864aa95d62eab, + 0x945d6f1dc5ea4d29, + 0xb3948a61f2ed4c95, + 0xc5b8da6323ce6af1, + 0x7a9d28b541d2896f, + 0x2f1bdc443fc497db, + 0x24e9d3165ed8c749, + 0x3d586c2879cad6b5, + 0x54b96deba9bde623, + 0x81ba5f9ed9c2148f, + 0x7c15642fe7c523fb, + 0xe359a24217d84269, + 0x29da1bc434ca61d5, + 0x7e2918c762bc7f43, + 0xac12f3e651ae6d9f, + 0x39a2bf887fa39c1d, + 0x3d96a4298ea4bc79, + 0xc98aef1edb97cae5, + 0x3b912761f89bea63, + 0xb6825472168ce7bf, + 0xa9e31c2659b1283d, + 0x123ab74657c436a9, + 0xd972346ba4c95617, + 0x1cf3e2bba2cb7583, + 0xfdb4356ba19b73df, + 0xa2cde53cbe8f925d, + 0xb8d729a1fe83b1c9, + 0xb847a3d21d95cf27, + 0x38fe4a132b87de93, + 0x7df6e9443768dbef, + 0x79ac1366578e1c6d, + 0xced6b24ba6813bd9, + 0xe2f745ced6a35b47, + 0x1bca492fe2a769b3, + 0xb79e2c11f2ab8931, + 0xfa97c543217c968d, + 0xcbf569732d6ea5f9, + 0xaed923c65e92d467, + 0xe2fc56987b86e4d3, + 0x2759ce1bab89f351, + 0xa9687eddc87b12ad, + 0x3e5426aed78e412b, + 0x9b8fc46fe5914f87, + 0x96e38cf215846de3, + 0xa2cf673543978d61, + 0x92f56de541587abd, + 0x5a7e1cf76f5d9a3b, + 0xd5a28e376d4fc9a7, + 0xa9c7defcbc73e915, + 0x7491a3cedb65f781, + 0x384697d1f95816ed, + 0xb8fdec72197c265b, + 0x7b5cd8e3286e34c7, + 0x7c963f2ba7918435, + 0x4692acecb47583a1, + 0x847d29ecb367921f, + 0x51cfdb9bae389f6b, + 0xc5bed32a9c3baed7, + 0x6b73925fea3fcd45, + 0xa83167d32a53fcb1, + 0x8cdab1754a561b2f, + 0x3c926fd659472a8b, + 0x37b5ca19864b39f7, + 0x41c73e6cb63e4975, + 0xbd4861fdc45287d1, + 0x5e8a749ed153964f, + 0x742f189fef2694ab, + 0xbe59fc321f3ac429, + 0x68ceab754e3cd295, + 0xc5743a276a4ed2f1, + 0x5e71ab3a9b54216f, + 0x5721bd4a98352fcb, + 0x47a6915dc7284e39, + 0xd5c46b9fe62b4da5, + 0xe735b981f54e7c13, + 0xfe9b5d1324318a7f, + 0x984fad26512398eb, + 0xce8a9bd54f16c859, + 0x429c31876e19d7c5, + 0xa4216e7a9b1ce743, + 0x9c4fb2eba81de49f, + 0x69a45c8fea24351d, + 0xdc93b411fa164379, + 0x26c147d4381962e5, + 0x491f6736572c8163, + 0x4de39166531c6eaf, + 0x47e3fa2984319e2d, + 0xdf1723a76ef2bd89, + 0x5afd23c98ae4cbf5, + 0x178b46edcaf8eb73, + 0xd7382aecb6d9e8cf, + 0xd8feb61328fe194d, + 0x61297b8548f137b9, + 0xa853df1769f45827, + 0xec8f9b1ba4f87693, + 0xa1654f2982d974ef, + 0xe482d53ba1fc936d, + 0x1d92bc798ecfa2d9, + 0x12bc5481fce3d147, + 0x49a3f6521bc5dfa3, + 0x65bea3f54ac8fe21, + 0x13f586c548ca1e7d, + 0x6ecadf3656bd2ce9, + 0x9d6c5efba8e14c57, + 0xf1976c3cb5e46ac3, + 0xcf263a1ed3e78a41, + 0x62b183d1f1ea879d, + 0x518caeb432eda71b, + 0x16495ce32ebfc587, + 0x32c89fe76cb2d5e3, + 0xeba6dc198bc7f461, + 0xe8b2346879c813bd, + 0x3591e7bba8dc423b, + 0x3412beaed6ce41a7, + 0x5492acbed5b16ef3, + 0x468fcb5325c48e71, + 0x142b9cd432a57bcd, + 0x19b4d78651d89c4b, + 0x2a1d79c54f8dcab7, + 0x24eb69f87c9fda25, + 0x5643f1dbacb3f891, + 0x17e4bd5dc9a517fd, + 0x5874c1b1f8c9276b, + 0xa7b932c218ab35d7, + 0x19b683d328be7645, + 0xea2846f876c284b1, + 0x4721c93984b5932f, + 0x287b465a92c6a18b, + 0x26fd8a7a9d68afe7, + 0xfe26813bad8bce65, + 0xe432815cb97fedc1, + 0xc18e3f932b941c3f, + 0x26cab7543a852c9b, + 0x2871fec657a84b19, + 0xa1de8438769c4a85, + 0xc926b31ba49d68e1, + 0x9e6b387dc3a1975f, + 0x749fa62fe18395cb, + 0x6527831fef87c539, + 0x8fa7d2b21f79d3a5, + 0x3c648b265d8ce413, + 0xd216ac754a6de17f, + 0x14ae86c87a8431eb, + 0x32598e1cba863f49, + 0x637f8e4dc6784eb5, + 0x2fa1763fe58b7d23, + 0x2b6d95afe25d6b8f, + 0x1aefd873236189fb, + 0x2aed79654173ca69, + 0xa7f184943f46c8d5, + 0xb519a6287d6ae853, + 0xcd35e218794be5af, + 0xf92eca5cba7f162d, + 0xb5acf32feb723489, + 0x1a8b3f4fe98763f5, + 0x82e36a42196a8273, + 0xb94a6e84345a71cf, + 0xb5ed28c7625c8f3d, + 0x498a3c187251bea9, + 0x76bd41ca9f54cd17, + 0xe348dc9bad46ec83, + 0xa4f8d69cba37e9df, + 0xd12c6eb1f94c1a5d, + 0x4857ce921a4f28c9, + 0xcd628a954b625937, + 0xf5de7b19894567a3, + 0x4fa6c39cb65a9721, + 0x839d41bba23b947d, + 0x7625f1dcb14da3e9, + 0x729f546dcf41d257, + 0x6a92d451fd45e1c3, + 0xe91d73f32c47ef31, + 0xf5e276b54b391f8d, + 0xc96b2346583b2df9, + 0xe51473f9892f3d67, + 0xc874152ba8426bd3, + 0x546218aed7368b51, + 0x716c5d4fe32678ad, + 0xda649171f13ca82b, + 0x7912eda4312ec697, + 0x2fcabd165e21d6f3, + 0x73a914c98d24f571, + 0x954cfa798b2714cd, + 0x1e4856ca9c1a234b, + 0x416fa7edc91d42b7, + 0x53e419bed93f7125, + 0x74826f3fe6237f81, + 0xe98fdc7325147ced, + 0xde59a68543179d5b, + 0xa31b26c65219abc7, + 0xbad513776efcdb35, + 0xed4a5cb76bdfe9a1, + 0x352c4e7babe4291f, + 0x2a7cf9bedaf5287b, + 0x2673ef4ed8f936e7, + 0xf5b8349219fc4765, + 0x678ecba436fe75c1, + 0xa48291e876e1943f, + 0x391a4c8873f4a29b, + 0x27f83ceba3f7c219, + 0xe2dc14998ed9cf75, + 0xfea261c989baced1, + 0xaf21c37cb8adec4f, + 0xa2d4e95219e32dab, + 0x2c79d5843ae64c29, + 0xb164ce5437e84b95, + 0x6f34bda875db69f1, + 0xf7136baa93cd786f, + 0x398415dba3e196db, + 0x1c679f2ed1e3c649, + 0x4b97f25fefc7d4b5, + 0x7b4fac321fcae523, + 0xb147fe643cabe28f, + 0xe824c1d659ae12fb, + 0xdbe31fa98bd34169, + 0x5c1ef48a98b64fc5, + 0x9c8ead6cb6c97e43, + 0xacebf61ed3ba6c9f, + 0x916d8b41f3ae8b1d, + 0x7514e9b323d1cb79, + 0x5d3f78a541b3c9e5, + 0xad3cb2554fb7e963, + 0x6fe125c54c98e6bf, + 0x249631a98bac173d, + 0x752af6bdc8bf25a9, + 0xcda92b6feac36517, + 0x758c3491f9c67483, + 0xad83f65215a872df, + 0x9a176fc434ab915d, + 0x7e6b3ad5427d8fb9, + 0x5cfeb91983a1ce27, + 0x369e1bf87f84ed93, + 0x1f5e2cb98b75daef, + 0x3cbd12ffec891b6d, + 0x74b25311f87c2ad9, + 0x3f9d4a221b9f3a47, + 0x678e5c1549a268b3, + 0x78b6ce3657b69831, + 0xaf73285763a7958d, + 0x641ed359827ba4f9, + 0x9761defcb19ec367, + 0xf517926cbf81e2d3, + 0x841329ffed96f251, + 0xa9865df43e8721ad, + 0xd18562354c793f1b, + 0xec2a17854a6c3e87, + 0xf5d8a937687f5ce3, + 0xcf3e172cb7938c61, + 0xe8ba1d4dc36479bd, + 0x4c3b71afe267a93b, + 0x6d5c7e91f15bc8a7, + 0xbf8a9e14327ed815, + 0xfa967c254e72f681, + 0x342edf776c7415ed, + 0xc43d712a9d78245b, + 0x782fd3ea9b6a43c7, + 0x4f1973ddca8d7235, + 0xb2937eced86f72a1, + 0x7ba2e54dc4527efd, + 0x8b327c9213549e6b, + 0x17fa94643246acd7, + 0x4a93d8b8716adc45, + 0xd139f5e76f4deab1, + 0x6d25a81a9d631a2f, + 0xd238e67dcd54298b, + 0x172a46fedb4638f7, + 0x165e3a21fa3b4875, + 0x9eb64c33294c76d1, + 0xaf693c43273e854f, + 0x9b6e4ad8765293ab, + 0xdf45b31ba456c329, + 0x3c4e2a5cb248d195, + 0xb597d2698d39cfe1, + 0xc58afe6a9a2bed5f, + 0x175be6c1fa412ecb, + 0x5864df721c254d39, + 0xe2cbdf443b274ca5, + 0xd52c3817694a7b13, + 0x2d1c7ea9852c697f, + 0x732c5b6a942f87eb, + 0x78952e3ed432c759, + 0xfd61324fe124d6c5, + 0x582a6f4edf19e643, + 0x38a59fb32d1ae39f, + 0xba24cf976c3e241d, + 0x5cef26d98d314279, + 0x852a14ba9b2461e5, + 0x362a85ecba187f53, + 0x8c2f49acb5186daf, + 0xa546193fe51b8c2d, + 0x849b1d2fe31fac89, + 0x4657abe43412caf5, + 0xb1f549a76215ea73, + 0x1fbc62d43bd5e7cf, + 0x4af23be76cfa184d, + 0x49fa65c87afd26b9, + 0x135f94acbaef4627, + 0xb5e23a1edaf27593, + 0x38af79ddc6d573ef, + 0xa9b3c46215f8926d, + 0xb52f4d1434fba1d9, + 0x68c21e4652edbf37, + 0x4a631fe872f1dea3, + 0x361957e98ec5fd21, + 0xf83eda6a9be61c7d, + 0xb92fd54dcad82be9, + 0xdc1b6781f9ed3b57, + 0x2f8397b218df59c3, + 0x2a319d865ae38941, + 0xd8c79f4435e4869d, + 0xd49c8e3874e8a61b, + 0xa278cf4a92ebc487, + 0x34d1b52a91bdc4e3, + 0xd928f53cbec2f361, + 0xb3497561fec512bd, + 0xcaf389632ed8413b, + 0xf1bce3932bca3f97, + 0x738951e548ab5df3, + 0xd831a7b658bf6d71, + 0x9a5d214985b27acd, + 0x6871bd9dc3d59a4b, + 0x359af24fe2d6c9b7, + 0x3948cba1f1cbd925, + 0x81a6ef9432bde791, + 0x5189cf754ea216fd, + 0x4b3c6fa87ec4256b, + 0xb1985ae76cb834d7, + 0x68b475aa9acb7345, + 0xf9147a3dc8ad73b1, + 0xf3a18b9dc6ae812f, + 0x7945f36fe4a29f7b, + 0xfc9423521394ade7, + 0xc7b594e432a8cd65, + 0x12ca9df65289ebc1, + 0xfbad41865d7cea3f, + 0x839a4cd87e812a9b, + 0x1784efddcdb54a19, + 0x7f5b4c9fecb74985, + 0x148792d1f89a67e1, + 0xcfab2562179c865f, + 0xd39f7413257f84cb, + 0xc86e425876a2c439, + 0xf67d45b98396d2a5, + 0x398e254cb4a9e213, + 0x32c6d5798c59de6f, + 0xe324a17a9a6c1fdb, + 0x16c5abe1fc813e49, + 0xec7698521c834db5, + 0xab8651754b987c23, + 0x2ca61b9437596a8f, + 0xbc728397645c78fb, + 0x1f962e8ba35fb869, + 0x738ecdacb382c7d5, + 0xcef97baed196e753, + 0x2483b9fdcd57e4af, + 0x12bd59843f7b152d, + 0xac71be254d6e2389, + 0xc6b198a87c8162f5, + 0x613984cbac958173, + 0xe8ba564a98456ebf, + 0x52e67facb6598e3d, + 0xf4a7d1bfe34c8da9, + 0x61bf79dfe35fbc17, + 0xb98aec421462eb83, + 0xc4d951743154e8df, + 0x145b2e376f48195d, + 0xb48271c76e4b27c9, + 0x2b1e648bac5e4837, + 0xeb4c987edc5176a3, + 0x2139687feb759621, + 0xae589731f846937d, + 0xcfb2d6321648a2e9, + 0x4a21b5f4364dc157, + 0xe478dc37624ecfb3, + 0xb6d2cf8a9264fe31, + 0x6d457c3a9f351e8d, + 0x2854db3bad372cf9, + 0xb67d389fed2b3c67, + 0xe32d6bc1f92e5ad3, + 0x157f98643c428a51, + 0xd9236b85492387ad, + 0x296b81365836a72b, + 0xe295c7b9842ac597, + 0x145d8cba942bc5f3, + 0x47ac86dcb23fe471, + 0xfa5c691cbf2413cd, + 0x9653b4a1fe17324b, + 0x74c6e9143e2941b7, + 0x7bd18fa54c2b6f15, + 0xf4be36c65a2d6e81, + 0xf3d281a768217bed, + 0x1e68bd3ba7139c5b, + 0xe12b647ed415bac7, + 0x84c29d6fe419da35, + 0xa1c7e351f32ce8a1, + 0x92f67de5432de71f, + 0xe7a38fc54ef1267b, + 0x4ae1fc576cf435e7, + 0x6ae59cf98cf97465, + 0xd53b7f1989fa74c1, + 0x196b784ba7ec823f, + 0x37fd425dc5ef819b, + 0x746d83fdc4d2aef7, + 0xc72ae53213f4ce75, + 0xc7df5a6543f7ecd1, + 0xa9b2f71651d9eb4f, + 0xb4a63e865fde1cab, + 0xd5c7b6198de14b29, + 0x51c8729cbce34a95, + 0xa12b683dcad768f1, + 0xfd6512afe5da876f, + 0xbef5a37216ec85db, + 0x875d43e326dfb549, + 0xa3e269f876e2d3b5, + 0x37c452aa95d7e423, + 0x4d72cf8a92c7e18f, + 0x5c24d1e98eca21fb, + 0x84e6135bacbd2f59, + 0xa9452ec1fab14ec5, + 0x9b4628721bc57d43, + 0x7c98f3a328c56b9f, + 0xda1f28c546c98a1d, + 0x8673d2a654cdba79, + 0x18f3e59873afb8e5, + 0x95de64fcb4c2e863, + 0x7bd9fa8dc1a4e5bf, + 0x2f1c586fefb9163d, + 0xb8cf6d721fbc24a9, + 0x5feb4a743dbe5417, + 0xdb92ca876dc17283, + 0x9f2bda4769a471df, + 0x2a3854da97a68f4d, + 0x3f56d4adc4a78eb9, + 0x43f7d51fe49cbd27, + 0x71fc6dafe28fdc93, + 0x5e6da7421382d9ef, + 0x576e32f542b51a6d, + 0x7ebdc5f54fa728d9, + 0x3f8bd5776eac3947, + 0x7d15f3b98c9e57b3, + 0x58fb6a2edcb29731, + 0xf41c792fe7a3948d, + 0x192f7bcfe586a3f9, + 0xb4cf52e2159ac267, + 0x6521fd35458bc1d3, + 0x724ade87638edf41, + 0x8ca4291872831f9d, + 0xe6cb718a9f863e1b, + 0xad32ce8cbe693d87, + 0x7ef16a4edc7a5be3, + 0x7a1bc531fa8e7b61, + 0x95d4fa332a6178bd, + 0x94b3ce832974a83b, + 0xe58f97143485c6a7, + 0x7f42e56a948ad715, + 0xc2bd387ba37ce581, + 0xb186fd4a916cf3ed, + 0x493ac6eedf84235b, + 0xaedb5311fe8642c7, + 0x1695fe732e8a7135, + 0x1a2f98743c5b6f91, + 0xb9f57a24384b6cfd, + 0xca4b896878519d6b, + 0x15ec7a6a9653abd7, + 0xfe2ab45dc367db45, + 0x94c3a87ed358e9b1, + 0x3eca9f5ed15be82f, + 0x8bcfd674325f178b, + 0x5136fed54e5236f7, + 0x6573824a9e384675, + 0x47bfea998c4975d1, + 0xe384b65a9a5b834f, + 0x15f3d48dc74e82ab, + 0x4927586fe863c129, + 0x8da9623fe643cf85, + 0xd34a7fb32546cde1, + 0xd15a8f954238ec5f, + 0xc8d41727624a1dcb, + 0x9da135487e4f2c39, + 0xd3e765aa9e324ba5, + 0xa879d51dcd467a13, + 0x6152cf4edb29687f, + 0xed38c4b1f72a86eb, + 0xbe83a472182eb659, + 0x859f4d376831d4c5, + 0x7c435fda9826e543, + 0x16fab5e98436e29f, + 0x4968fc2cb45a231d, + 0xe1f75a2cbf2d3179, + 0x2ed8c54bab1e3fd5, + 0xd96c7b31fc127e53, + 0xbf985e632b146caf, + 0x97fc5b854a178b2d, + 0x3682ad55461cab89, + 0xbf852ac8761db9f5, + 0x26e8759cb621e973, + 0x8271efcba413e6cf, + 0xd597836fe328174d, + 0x37fec82edef825b9, + 0xbf9236a21efc4527, + 0x38d19c732cfe6493, + 0xb84c6a165ad172ef, + 0x64acf5e87af4916d, + 0xe941fd2876e58fc9, + 0x79425e6ba5f9be37, + 0x72af185a94fbcda3, + 0xf27ea1dcb4dfec21, + 0xafcb761324f31b7d, + 0x582e9ab541f52ae9, + 0x693f1b254fe93a57, + 0xe5f847976deb58c3, + 0x61d83caa9bde7841, + 0x74516c3cbae1859d, + 0xc69e123ed8e4a51b, + 0x1b36cae1f5e6c387, + 0x543cb6a216d9c2e3, + 0x2f85eb6545dce261, + 0x9c7f6e15429cefad, + 0xefadc62981d43f2b, + 0x7c4db5f98fc53e97, + 0x48f3a2ba9db85cf3, + 0x639f8bafeadb6c71, + 0xbc6749a1f7ae69cd, + 0x98561df328d1a94b, + 0xe91648a326d3c8b7, + 0xdba82f1546c7d825, + 0x9f3bdea874cae691, + 0xf92c13b8729ae4fd, + 0x5ef78d3ba2cf146b, + 0xf34e1dbdcfb243d7, + 0xc841a3b1fec87245, + 0x495bc2643ec972b1, + 0xc891b5a43b9a7e1f, + 0xab4197f4369d8e7b, + 0x3b6dfc265691ace7, + 0x75613daa97a3dc65, + 0xdec2873cb496eac1, + 0x9a6b857dc2a8e93f, + 0x23418ca1f2ad189b, + 0xc9851fd542bf3819, + 0xb72416a43fb24785, + 0x57982c654da576e1, + 0x1c34abe76ca9845f, + 0x25a4e187697a83cb, + 0x9a3e571dc78eb239, + 0x1b9c3d8fe792d1a5, + 0xc6a32b8ed584cef1, + 0xec265bd21385ed6f, + 0x759ed31543781edb, + 0xdce48397618c2d49, + 0x7e84a5176e7f3cb5, + 0xbd38e9fbae947b23, + 0xa348ce1cbc74698f, + 0xaf61bc5eda5687fb, + 0x87b4c131f85cb769, + 0xe972d4f2187eb6d5, + 0xe2689b754891e653, + 0x8591ac476574e3af, + 0xcb958d2ba598142d, + 0x8652beddc17b3289, + 0xe132f94bae7c41f5, + 0x8e715dfcbc7e5f63, + 0x413d957fea526dbf, + 0x34f7db921b658c3d, + 0x8af9c4e32b468ca9, + 0xfca31985485acb17, + 0x241faeb8765eda83, + 0x485fc61a9451e7df, + 0x1b8df73dc374185d, + 0x761a4c3fe15726c9, + 0x85f29d1fef5b4637, + 0x2e37b6421f4d65a3, + 0x2e671a554d6f8521, + 0xf37c81476c53927d, + 0x3c1f62587b45a1e9, + 0xc17529bba938bf47, + 0x34be967ba649ceb3, + 0x517a6d4cb65ced31, + 0xdc875141f4521c8d, + 0xa8746b3213542bf9, + 0x79be3cd651483b67, + 0xda4e21376f2a59d3, + 0x793261c98e3d7951, + 0xab19c3e98b2f76ad, + 0xb35efa7edc43a62b, + 0xba9152ffea25c497, + 0x6f1254bfe728c4f3, + 0xf8673153284be371, + 0x579a61f5453bf1cd, + 0x86ce723a9762314b, + 0x1b632a4a91243fa7, + 0x53ef1b8baf286e15, + 0x396ced2cbe2a6d81, + 0xea96d38dc91b6aed, + 0xc4da98bfe91f8a5b, + 0xeaf614d43a12b9c7, + 0x8b5a63254a16d935, + 0x1d8e64365628e7a1, + 0x4a162dc9852ae61f, + 0x7e43c6bba42e157b, + 0xab7f1e4dc52134e7, + 0x519f6eddcef27365, + 0x86a3579fedf673c1, + 0x657ec9f32ce9813f, + 0x53fa849329ea7f8b, + 0xf1546de436ec9df7, + 0xa83f52c768f1cd75, + 0x3badc57986f4ebd1, + 0x13acbeda93d6ea4f, + 0x42a8671ed3f819ab, + 0x9683c15fe1fd3a29, + 0x345fbae321ef3895, + 0xbcf65d354ed367f1, + 0x9afc21743cd4856f, + 0x2341ef865ae784db, + 0xec93a14878ecb349, + 0x8735eaca97dec2b5, + 0xe9216abdc8d4e123, + 0x1824be7dc4b3de7f, + 0xe78c9fd324c61feb, + 0xda56321543da2e59, + 0xce3a4d7761eb3dc5, + 0xae38d4f87ebf6c43, + 0xe9612fd87dc26a9f, + 0x1c8d956babc5891d, + 0x6b72a8ffead6b879, + 0x5db632c1f6cab7e5, + 0xb54cd79218bed763, + 0xda617e4436a1e4bf, + 0x542cf1b987c6153d, + 0x9a47b6c984d723a9, + 0x7c86e3bba2db5317, + 0x21bef36bafbd6183, + 0xa4286d1a9a8d5ecf, + 0x5eb18921fba28e4d, + 0x927eb4821ca48db9, + 0x465e8fa439a8bc27, + 0x3ae95715468adb93, + 0xd6347e16547bc8ef, + 0xdf83615ba5b2196d, + 0x15b9dfedc3b427d9, + 0x1b3c45afe1c93847, + 0x1423f8cfef9a56b3, + 0x3d187f632fad8631, + 0x4eac65332c9f738d, + 0x791c6e365c83a2f9, + 0x61fcad798ba5c167, + 0x5364a7ca9687bfc3, + 0xd5f9e38cb68ade41, + 0xbcf35d2ba36bfc9d, + 0x147b2361f5923d1b, + 0xa572b49212a43c87, + 0x376efb1541975ae3, + 0x3527e9154f8b7a61, + 0x9c2b71e54e5c67bd, + 0x4db57e198c6f973b, + 0x95abc38edb82c5a7, + 0x4f96c1dfea97d615, + 0xd749be61f679e481, + 0x479ba2f21569f2ed, + 0xea51c8b5468e125b, + 0xe35a29d9859241c7, + 0x5984cb3ba1946f25, + 0x9278eb6baf576e91, + 0xca6b357a9c486bfd, + 0x25bfd48fea4d8c6b, + 0xf53d1c9fe84f9ad7, + 0xf4dbae221b72da45, + 0xcbf812743965e8b1, + 0x5679cba54658e72f, + 0x81ad546a945c168b, + 0xd92fe16ba36d25f7, + 0xe7a2416ed2916475, + 0x2fb513adcf6574d1, + 0x38f5d42fed57824f, + 0xc69ebfa32e4981ab, + 0x8fbdce743b4caf19, + 0x8791ad25493fbe85, + 0xb31d6ac87853dce1, + 0xda61347a9734eb5f, + 0xc891f27ed5471acb, + 0x3b4762ffe45c2b39, + 0xe219dcb1f14e39a5, + 0x1b92fa8654627913, + 0xbc17e3954e23867f, + 0xd51c36254d2685eb, + 0xa2d3f8e87d2ab459, + 0x3db26f49892db3c5, + 0xa3e72f5cb95fd243, + 0x3f576a8dc743e19f, + 0x5a236c11f857321d, + 0x9c4abf6215382f69, + 0x5e74f1a7642a3ed5, + 0xfba96dc9812e6d53, + 0xc85423f87e216baf, + 0x4a76f82a9e148a2d, + 0xf48b132dcd15ba89, + 0x3ef1478eda19b8f5, + 0x3ea148b1f91cd873, + 0x539b1f43271ed5cf, + 0x9a5c68487923164d, + 0x4269ea19871624b9, + 0x42e8c1acb61a5427, + 0x361a298cb41c6293, + 0x543b69a98cdb61ef, + 0xfba47c5a9ace7f5d, + 0x39a5ec1edaf28ec9, + 0xf297b8321af5bd37, + 0x63db871328f7dca3, + 0x7632dab657faeb21, + 0xec69df8654ecf97d, + 0x9b12cf5ba5f128e9, + 0x78a3f4ddc2f43957, + 0xf13b862ed1f857c3, + 0x4a18fecedfeb8741, + 0xdf4eac221fec749d, + 0x92486af43cdf941b, + 0x4e6fd2865be3c287, + 0xab8f3e5879d6c1e3, + 0xb8a7d5ea97c8df51, + 0xda4819b874b8fead, + 0x1625d3bba5cd1e2b, + 0x85edab91f4e13d97, + 0xe489fc7212d45bf3, + 0x98ed36a542e86b71, + 0x984e17c43fb968cd, + 0x18abcd965ecd984b, + 0xb2fe87c659cfa6b7, + 0x58f42c6cbac3d725, + 0x9f65e13ed8c6e591, + 0xba34e78dc5a7e3fd, + 0x578143a327dc136b, + 0x81cd2ae545be32d7, + 0x57cdaf8a96d27145, + 0xacf1936982c46fa1, + 0x7d1a2ce98ea67d1f, + 0xe7adfb176ea98d7b, + 0x96a3428eda8c9be7, + 0x4cb2f97fe89fcb65, + 0xbd86359328a3e9c1, + 0x3f9b6e8327a5e83f, + 0x2eb3dc8545c8179b, + 0x7a39b26985bc3719, + 0x3e6fb2dba2be3685, + 0x9b678e1dc3b275e1, + 0xf86a514dcea4835f, + 0xc76b3151fe9682cb, + 0x4786fdb32e8ab139, + 0x4e895f332a7cbf95, + 0x913b5da5487ebdf1, + 0xf863b2765782ec6f, + 0x75fad8ca96851cdb, + 0xafc3429ed5a82c49, + 0x2dc9f4bfe28c3ab5, + 0x5cd689e1f19e6a23, + 0xa51f248432a1678f, + 0x4c5f81632e7386fb, + 0x9ef857a43e87b569, + 0x9a2fe8576c79b4d5, + 0x8fa5d1ca9a8cd453, + 0x3cef765a976ed2af, + 0xd479a15fe895132d, + 0xde4cb251f5a63189, + 0x65f94ca214783fe5, + 0xe6d15875428b5e63, + 0x59cf7bd5416d5cbf, + 0xeb3f89687f618b3d, + 0xc1e32fd87e538ba9, + 0x8a2c34fcbd56ca17, + 0x478a329feb5ad983, + 0x897a51cfe74ac6df, + 0xb5af2382184ef65d, + 0x19fd85c5487325c9, + 0xdceb98fba6984537, + 0x8a5fd41cb27964a3, + 0x3846ad7cb37c8421, + 0xf3684e2baf4e817d, + 0xf9d2a57cbc418fd9, + 0xeda1bc61fc53be47, + 0x4327ebd21a46cdb3, + 0x7bd192354a59ec31, + 0x29c76155463bfa8d, + 0x2d931ea8764e1af9, + 0x426f987dc8523a67, + 0x75abd49dc24658d3, + 0x85caf37fe24a7851, + 0x53b8f71fef2b75ad, + 0xd6a843521f3e952b, + 0xbead28365e41c397, + 0x52439c887b45c2f3, + 0x862bec1a9b48e271, + 0x5b43da998627efbd, + 0xf395b2eba74c1f3b, + 0x7156da3dc53f2ea7, + 0x4cdbe311f7436d15, + 0x1dfb934324356c81, + 0x15ce7285412769ed, + 0xa2538d654f1c895b, + 0x64938fc65d1ea8c7, + 0x1e6bf93bac21d835, + 0xf67b89adcb24e6a1, + 0x138945adc927e51f, + 0xdb237181f82a147b, + 0xc963fad5481c23e7, + 0xc951e6f8781f4265, + 0xadebc13a963472c1, + 0x34c5b87a93157e2f, + 0x4ea79c176df57e8b, + 0x125d3c876be89cf7, + 0x56e1289ba9fdbc75, + 0x5d41837cb7efcad1, + 0x6974f5a218d2e94f, + 0x9e84db7437f518ab, + 0xdb69f47656fa3829, + 0x76c9b2a984fc3795, + 0x72bdac1a93ed56f1, + 0xe49af5dcb2e1846f, + 0xde14385bafe483db, + 0xb3768e51fde7b249, + 0xbe7af6d32de9c1b5, + 0x2a3df8b549dbcf13, + 0x4bad576436aecd7f, + 0x8543179767c31deb, + 0x9c31d52ba7e62d59, + 0xdcf73b6ba4e83bc5, + 0xa2637f5ed2ec6b43, + 0x42ad738fe1cd589f, + 0xda2b7c3543e2981d, + 0x65713e932fd3b679, + 0x58429d643dc7b6e5, + 0x1498d6b87bcad563, + 0xf9edb787679ad3bf, + 0x42e5d67a97aef23d, + 0x8f17362fe7d432a9, + 0x5e8a64d1f6d85217, + 0xb5293fc214c95f73, + 0xe1a4986432a95dcf, + 0xc39b8f7651ae7c4d, + 0xfa2e6b465fa18cb9, + 0x35f17ad98ea4cb27, + 0xe65ac7398cb6da93, + 0xdc41253cb698c7ef, + 0xb4cd253fe59bf76d, + 0x683517c327af16d9, + 0x2c8af16659c23647, + 0x26c759a984c765b3, + 0x2cad361a94ca8531, + 0x3862ab7a91ab728d, + 0xf39b162bae7d81f9, + 0x81a4e65dcd91bf57, + 0x15be3821fa84bec3, + 0xcd49bf832b97ed41, + 0x8b49f6132867fb9d, + 0x38ac9be6578d2c1b, + 0x4c1fb2a7659f2b87, + 0xf5ac768cb6a259e3, + 0x768ebafed3b57961, + 0x8bfa179fe19876bd, + 0x5d78b26fef7c963b, + 0x4853e7d21f6eb4a7, + 0x1c79b8a76e92d415, + 0xc1e358276c95e381, + 0x3962dea65976f1ed, + 0x572861bdc98a215b, + 0x69cf48dba56c2fb7, + 0x274eb16dc68f4e25, + 0x4513b971f4836d91, + 0x4a59f68212746afd, + 0xea652b4431578a6b, + 0xd5e9c8a43f4ba9d7, + 0xb43d59287d6ec945, + 0xa18c547a9c62e7b1, + 0xe3d9a87cba74e62f, + 0xb2c3f54fea67158b, + 0xc968475fe86a24f7, + 0x9265cde2198d4375, + 0x7e2d9f65457f63d1, + 0xb86df14a9573814f, + 0xafbc764981547f9b, + 0x5f2e3a698f47ae19, + 0x4358efda9e3abd85, + 0x284de56ba94dcbe1, + 0xe2165a3ed941ea5f, + 0x68f7de432a5419cb, + 0xcdb52f854b572a39, + 0x9483c1b7674b38a5, + 0xfd685b4ba75d6813, + 0xf4b6d9eba23e657f, + 0x172f58bdc15284eb, + 0xce517b8edf26b359, + 0x38b27591fe38b2c5, + 0xce5d4b732e5bd143, + 0xa2c5b744392bce8f, + 0xcf2794a769421efb, + 0x26b49df98a342e69, + 0xd6c53b4ba8273cd5, + 0xf8c356eed72a6c53, + 0xb534279ed32c59af, + 0x7f685cafe13f792d, + 0xa68e91f54132b789, + 0x85e1dc943e14b7f5, + 0x327cfbd65e19d673, + 0x25e4dc776a19d4cf, + 0x3794bf19891cf34d, + 0xaceb9f1eda4123b9, + 0xad7fb89fea165327, + 0x6e9a7d41f7286193, + 0x3de7894324185edf, + 0xedcf1a65431b7e5d, + 0x3c472966521f7dc9, + 0xb592e8f76ef1bc37, + 0x59f42d187cf4dba3, + 0x46c5eb3a9bf7ea21, + 0x3925d46cb6e9f87d, + 0xb7cf2e4ed6fc17e9, + 0x79e2f68219ef2857, + 0x36bdec9548f256c3, + 0xab3e7c4a95f78641, + 0xfe14b97762f8739d, + 0x94fe367982fc931b, + 0x71c8d24a9fdeb187, + 0x58cfd74a9ac1bfd3, + 0x93ac71d1fac4de51, + 0x765928f218b5fcad, + 0x89cbd61548e91d2b, + 0xd853196546ed2c97, + 0x41e35d6876ce4af3, + 0x856f137cb5e36a71, + 0x154e29dba2e467cd, + 0xbe91f78ed1e8974b, + 0xb956a4ffefdca5b7, + 0x4b6ed5821fbec625, + 0x2618bc365dc2e491, + 0xd12b478659a4e2fd, + 0xb35861f87ad8126b, + 0xaf3ec71a98ca31d7, + 0x278f134ba7bc4f35, + 0xa1623eddc4bf5ea1, + 0x3d96748fe4b37c1f, + 0x2ea3f86212d48c7b, + 0xcb1892a431c69ae7, + 0x98517f443f9bca65, + 0x123f67b65b9ed8c1, + 0x53fe46998ba1e73f, + 0xb416a89edac4169b, + 0x718a492feac83619, + 0x674c5e11f7cb3485, + 0x36f7a4b327ac64e1, + 0xd51ef29434ae725f, + 0x4da8eb9764a381cb, + 0x2365bac871b5af29, + 0x5cbf87a76f87be95, + 0xd647cfb98d79bcf1, + 0xf15e263ba97cdb6f, + 0x3495ead1f9821adb, + 0x879354c21ca52b49, + 0x3f4189c328a739b5, + 0x8ac6243657ab6923, + 0xbd9ef838739c568f, + 0x86d7be5a928e75fb, + 0xf46b832ed1a2b469, + 0x218d4afdcf86b3d5, + 0x4d93c851fe89d253, + 0xafe46bc32c69d1af, + 0x1f74b654396bef1d, + 0x81b4d6765b812f79, + 0x239cb5d879843de5, + 0x5ac71decb7985d63, + 0xf89be54dc3685abf, + 0x9af1468fe26c7a3d, + 0x5bd6278fe15f78a9, + 0x8621d7554283c917, + 0x9e4acf132f65d783, + 0xd756cb843b47c5df, + 0xe32b96887b6af45d, + 0x9e1cfab98a6e14c9, + 0x873aeb1edb915437, + 0x271fc58fe98562a3, + 0x79b136a1f6798321, + 0x79e5ca6213497f6d, + 0x472dcf94324b7ed9, + 0x537ecfb7615fad47, + 0x49ce31b87f52dcb3, + 0xe3af714a9d56eb31, + 0x1e632b8bab36f98d, + 0x76f2345eda4b18f9, + 0x8d6179e1fa4e2967, + 0x9d6be4832a6157d3, + 0xc62b79f43a648751, + 0xc217e659853674ad, + 0xec591bf9835a942b, + 0x4e6dc5fba14db297, + 0xdf68531a9d4eb1f3, + 0x43a2e7dcbc43df61, + 0x7815394dc924febd, + 0x31e74cb32c481e3b, + 0x89237fe5493b2da7, + 0x4b31a288793e4c15, + 0xf21c837ba9426b81, + 0x4f9658bba52368ed, + 0xae2bf85ed326985b, + 0x4c31d86fe129a6c7, + 0xc6a927dfef1dc735, + 0x17da4b243e2fd5a1, + 0xce7439a76c23e41f, + 0xfb6415d98d26137b, + 0x762d43998b1932e7, + 0x3c2f697cba2c4165, + 0x6be3f29ba72d5fb1, + 0x384d167dc6317d2f, + 0x465ed791f4137d8b, + 0x9716ef8323159bf7, + 0x5dbc7a654219cb75, + 0x8edc13954efac9d1, + 0x42e698d65aecd84f, + 0xa416f2c98cf217ab, + 0x179fae8dcbf53729, + 0x184567aedaf83695, + 0x28a59e4ed7ea65f1, + 0xa69b354215ec736f, + 0x8aed765434ef72db, + 0x64cedf9875f3b149, + 0x8a9c3f2871e4bfa5, + 0xac2df6b87fd8ce13, + 0x371ecdb76ab9dc7f, + 0x46732b59879cfaeb, + 0x269e14b1fae12c59, + 0x3274ecd219e43ac5, + 0x6ced581329e86a43, + 0xfe1498c434da579f, + 0x73cd2af764ec871d, + 0x7a1f42b982dfa579, + 0xd47efbcba1d2b4e5, + 0x9264d8ecbfc7d463, + 0xa85b7d2feca7d2bf, + 0x5b6418e32cbaf13d, + 0x32cf6e854bce21a9, + 0x78cdb39769b13ef5, + 0xd9e1c2f989c45e73, + 0xdc35694984a65bcf, + 0xbd539c1ba3c97b4d, + 0x5764dbafe2cd7ab9, + 0xf1b6c57fe1cfba27, + 0xa9cebd1541c2d893, + 0xa1b536932d94c6ef, + 0x87ab2cd43ca8f56d, + 0xa428bf776cab15d9, + 0xe45ad82a9abe2547, + 0x6f185c2ed9c164b3, + 0x58439dafe9c68431, + 0x5e1639c1f4b6718d, + 0xd2af3b5213a87fe9, + 0xb27aef44329cae57, + 0x7b9d8fc6518fadc3, + 0x638eadb87f93ec41, + 0xb319e2a76c74fa9d, + 0x73286ebdcd982a1b, + 0xc7846b3feb9c2a87, + 0xe68acd31f79d48e3, + 0x5d8146a43ab27861, + 0x5df4e873269375bd, + 0x1d359ef764a7953b, + 0x9d52bc376289b3a7, + 0x91fd64bba29dc315, + 0xc537f6ebae7fd281, + 0x5afe73ba9a62efcd, + 0x861fbc7fec861f4b, + 0xbd5679821c682eb7, + 0xd8f21a643a8b4d25, + 0xa1e5b685487e5c91, + 0x32c75f69857169fd, + 0x1a24d7bdc473896b, + 0xda56f98dc265a8d7, + 0xc915bd6fe17ac845, + 0x5ac31f7fef5cd6b1, + 0xae54b3921c6ed52f, + 0x34bc8e665e73148b, + 0x8f7ad4165c8623f7, + 0xfe8c5b3a9c8a4275, + 0x618fc7dba97b62d1, + 0x5263b14ba75c6e3f, + 0x8e1b4f6ed4517e9b, + 0x6c2a9db1f364ad19, + 0xf24735621246bc85, + 0xb36ac1254258cae1, + 0xb36fc2954e3bd95f, + 0xcb47e8f65a3ef7cb, + 0x7a68513cbd642839, + 0xf49aec7edc4637a5, + 0xf2b196dfeb5a6713, + 0xf6c8271fe83b647f, + 0x984e2fa2164d73eb, + 0x86f3b2554761b259, + 0xd9175f698364b1c5, + 0x8a4d32ca9157cf23, + 0xb41c29576e27cd8f, + 0xe53c48987a29ecfb, + 0x1a7e523dcb3f1d69, + 0x23ed1851fa423bd5, + 0xe9f38c421c276b53, + 0xda271e94392758af, + 0x4fec76a6563b782d, + 0x4c258bd8742ea689, + 0xd2e9647ba431b6f5, + 0x619f872dc124d573, + 0xf9841b3bae16d3cf, + 0xc46a281fec19f24d, + 0x756ac9d54e3d12b9, + 0xd9c352b76c3f4127, + 0xd685e4987b125f83, + 0x3ef24cd878145cdf, + 0x7c152d3ba6187c5d, + 0x27495a6ed41a7bc9, + 0x7164c3fed41eab37, + 0x5e1b4621f421d9a3, + 0x928c3a776435e921, + 0x1ba8f9532ce4f67d, + 0xc52396d54cf816e9, + 0xbaf9ed298bfc2657, + 0x7a35e1f989fe45c3, + 0x37baf84dcaf28541, + 0x3a6d8efdc6f4729d, + 0x631c52bfe5f7921b, + 0xe2b6fc8213e9af67, + 0x7ad1689542fbaed3, + 0x9e4df75762efcd51, + 0xc76efd265ec2fbad, + 0xb3ef7d998de61c2b, + 0x6dce97fbace82b97, + 0x4965bdedc8db49f3, + 0x4a6b5dc1f8de5971, + 0xe37d8ca328e176cd, + 0x4ade735327e3964b, + 0xc8d167e653e6a4b7, + 0xac624fe983eac425, + 0x3d7baf4982ecd391, + 0x3159f4887b9ec1fd, + 0xf3e485adced4216b, + 0x3fd84acfeab52fc7, + 0xb52afd621bc94e35, + 0x2a19865438cb5da1, + 0xb1af59d547ad6b1f, + 0x7e2dcf3765d18a7b, + 0x315af76984c3a9e7, + 0x2a8fc61cb2d7c965, + 0x1ba4853fe2b9d7c1, + 0x67e43dbdce9bd63f, + 0x2789ecb21d8ef49b, + 0xbac21d776ec43519, + 0x4a31fb776dc74385, + 0xe85a19387ab963e1, + 0xbd7163fa98ab715f, + 0x6b1c28ea948d6fab, + 0x167c82aed5b1ae29, + 0x9451de71f2a3bd95, + 0x7ba6ef132396cbf1, + 0x7a4d15b43198da6f, + 0xa472d9643e6af8db, + 0xb91cd2a76d8f1a49, + 0xdfb16cea9da238b5, + 0xb59a7f2edcb76823, + 0xe7b1c56ed7a9658f, + 0x15fbcd8fe58a74fb, + 0x784cd362158ea369, + 0x35c6def54691b2d5, + 0xbe7195d984a6d153, + 0xc7e129476175ce9f, + 0xc8d1e2687c68fe1d, + 0x6b3e579bad6c1e79, + 0x6843572cba7f2ce5, + 0x9d528b71fb925c63, + 0x7c5e96d21a7459bf, + 0xe4d93fc32a68793d, + 0x4e5f6b24345c87a9, + 0x3d8cfb6a946eb817, + 0x4c52a7ecb491d683, + 0xe96d3c2ba173c4df, + 0x52146e9cbe67f35d, + 0x954267c1fe6a13c9, + 0x6534dac21e8d4237, + 0x3fd1e5c54c7f51a3, + 0x7eb2c3a549625def, + 0x2f67519989547e6d, + 0xe53c78bba5467cd9, + 0xba26573ed35bac47, + 0x795a2beed25ecab3, + 0x572839c1f472ea31, + 0xb4635de32153f78d, + 0xae8b2f543e4617f9, + 0xebf928165e4b2867, + 0x9bfc71e98b5c46d3, + 0xf93862dbab4f7651, + 0xd6a843fdc95273ad, + 0x2b83719fe856932b, + 0x17d6b521f548b197, + 0x6f543d721549afe3, + 0x1ae32d76534dce61, + 0x531a42f76241fcbd, + 0x56fa1be98f451d3b, + 0x3abde1ca9e362ca7, + 0x4725da9dcd3a4b15, + 0x1fdc295feb3d5a81, + 0xbe41723dc82f57ed, + 0xa43275621a32975b, + 0xe2d96f143824a5c7, + 0xb95c1f398729c635, + 0x9653c4e9853bd4a1, + 0x2e61c83a924cd31f, + 0x8ab754edcf43127b, + 0xd768f32dcd2531e7, + 0x9cb5fd1fec183f45, + 0xdc7e9a543c295eb1, + 0x2f958b75491b6c2f, + 0x87ce5d15471f6c8b, + 0x762fd1b986129af7, + 0xc71634dcb614ca75, + 0xea3f96dcb427c8d1, + 0xbde7243dc21ad74f, + 0x16f3e47a9decf5ab, + 0xd96841543def1629, + 0x7ea5b1f76df23495, + 0xd21fbce65be764f1, + 0x2a7893f65ae9726f, + 0x95234b1986fa71db, + 0x47f386bba5ed8f39, + 0x732d64fdc4f1bea5, + 0xa92d8b1fe4f5cd13, + 0xe3859da212e5db7f, + 0xf8ba617431d7f9eb, + 0x3f719a854fed1b59, + 0xca3147576bdf29c5, + 0x6175398bace26943, + 0x963f8c7cbad4569f, + 0x76892f3dc7e9861d, + 0x76814eb1f5eca479, + 0x78ba24c216cda3e5, + 0x8ba146d657e1d263, + 0x9ebfa15763c4d1bf, + 0xec52f1a871b6ef2d, + 0xb354acd76eca1f89, + 0x5ab192c98cab2df5, + 0x5b43d2edcabf4d73, + 0x46d8bfcfe8b25acf, + 0x9dc7385219c57a4d, + 0x7c5eab4325d678b9, + 0xf9c16b5545dcb927, + 0x1a2b95f764bec793, + 0x453b219983a1c5ef, + 0x8cb631eba1b3f46d, + 0xb87e94ddcfb714d9, + 0x5e783a91fecb2347, + 0xd69e74f21ead52b3, + 0xfc2371465cbf7231, + 0x3e2cb67549a26f7d, + 0xa21b9cd656a47de9, + 0xf8de374a94b8ad57, + 0xb1952aced489abc3, + 0x1ad68e5dc39edb41, + 0x4fc2b97fe2a1f89d, + 0xf51de6c543c5291b, + 0xe76bfcd43fb62987, + 0xf4d6b8265d9a47e3, + 0x21ea3cb98cad5761, + 0x2546ea98798f64bd, + 0x9b6231fed8a2943b, + 0x8a24d5ffe695b2a7, + 0x578b3d11f6a9c215, + 0xc8e1b393248acf71, + 0x8cd5e6a4326abecd, + 0xf25bcd8873921e4b, + 0x85b72da76f842db7, + 0xb271c84bae984c25, + 0xe295d6adcd7a5b91, + 0x2b34e59dc96b58fd, + 0x483c269fe95f786b, + 0x83bf25721982a6d7, + 0xd416e5b32896c745, + 0xe1c4a9876478d5b1, + 0xd6b91739837ad42f, + 0x1548c7da916df28b, + 0xf9c2674cbe8132f7, + 0x1357469ede964175, + 0x48b2c51feb675fc1, + 0xd49ca6321b596d3f, + 0xfb379ca3284c6d9b, + 0x1b785e35475f8c19, + 0xe8651a7a9762cb85, + 0xfb5418eba465c9e1, + 0x74e1cfacb247d85f, + 0xb271e5fed149f6cb, + 0x85cae26edf5e1739, + 0xf46d7eb32f7136a5, + 0xefc6a8354e857613, + 0xf439eb265c48637f, + 0x4fd59e176a4972eb, + 0xd1af52ccb84da159, + 0x15b26dfba63e9fb5, + 0x9658bf1ed764ce23, + 0xda56738fe234dc8f, + 0xefd8bc321236eafb, + 0xedf846a6524b1c69, + 0xd3a84fc76f3e2ad5, + 0x513842aa9e416a53, + 0x1b82acda9c2357af, + 0xbf94e16dcb36872d, + 0x9345fa8fe72ba589, + 0x5d13a8cfe72ca4f5, + 0xbdc542e2182fc473, + 0xef17d3965643d2cf, + 0xbd79eac98536f14d, + 0x73d94fcba34821b9, + 0x482536aa9e2b3f17, + 0x254b38fbac1d4e83, + 0x6b7981fdca215bdf, + 0x4ce8b571fa137b5d, + 0x64fdba532b157ac9, + 0x5ec7f3654819ba37, + 0x1ace3676561dc8a3, + 0x54b683ea963fd821, + 0xcf6e953ba412f57d, + 0xe963182dc32615e9, + 0x1e56fa2dcef92457, + 0xb3a2847fedfa54c3, + 0x96eba1832cfd7341, + 0xb2e716543aef619d, + 0x613a2d9548d27ef9, + 0x2c8d3a1658f4ae67, + 0xda94e53985f7acd3, + 0x2aedf48a94fadc51, + 0xe73c69b982fce9ad, + 0xd764f8cfe4f31a2b, + 0x5ea4c61431f42a97, + 0x5dec7b132ed748f3, + 0x783519a54deb5871, + 0x83a126d549eb65cd, + 0xc2ab6e1879df854b, + 0xb5496fddc8e2a3b7, + 0xecf9b42ed8e7c325, + 0xc637b121f5e8d291, + 0xd7c2a86213a8bfed, + 0xac7586f432acfe5b, + 0xeb48712763d12ec7, + 0x2c1b54798fc64d35, + 0xa97253498ed75ca1, + 0xfca4d1b98bc96a1f, + 0x81ac436fe8cd697b, + 0xa82735eed5bf98e7, + 0xdb2c794219d2c865, + 0xafc45d1437b5d6c1, + 0x453b97f764b8d53f, + 0x7e3af58762caf39b, + 0x8fe7b46ba3ce2419, + 0x1c2a764cbfc14285, + 0x29d3b71dcdb562e1, + 0xe2843cbedba76e4f, + 0x6d9475a21c986eab, + 0xcd695fe437ac8d29, + 0x41657fa4368fac95, + 0x36c52b487693caf1, + 0x3ecf2da983a4d96f, + 0x7edf4c2ba296f7db, + 0xc3d2495fe2bc1849, + 0xc29f416edf9e27b5, + 0xa7359ed54fb16723, + 0xe3d41a932da3648f, + 0x129df8754c9673fb, + 0x823746f65c8ba269, + 0x86cead7a978ca1d5, + 0x149253eba68ebf43, + 0x1e6275ccb472cd9f, + 0x6adc497fe385fc1d, + 0x4316f5d323a81d79, + 0xd953b2f5418a2be5, + 0xbcf47ed65f8e4b63, + 0x87c39f276d7158bf, + 0x479d1fbbac94783d, + 0x2f76853edc7586a9, + 0xc462358fe98ab617, + 0x8bd21e61f67dc583, + 0xf24c79a2156eb3df, + 0x8f5a7cd54683f25d, + 0x28ba9438748612c9, + 0xc81a973cb29a4137, + 0x5ba126498e6b4f93, + 0x2965fc398a5b4cef, + 0xc659384feb517c6d, + 0xeb3d9861fa537bd9, + 0x2da46b821c56ab47, + 0x8653edc32758c9b3, + 0x913a7626576cd931, + 0x1fd9c8e8734fe68d, + 0x2c86497cb47316f9, + 0x7e2a136ed1982567, + 0x719de48dcf6945d3, + 0xc7a25e31fe6c7451, + 0x48cebf721c4e62ad, + 0xa76e42165d63912b, + 0xda7621865b43af87, + 0x14dcf5387846ade3, + 0x9c273ebba749cd61, + 0x6b759d198439eabd, + 0x78b136ddc24efa3b, + 0x451b69d1f1532ba7, + 0xf1584cb432674a15, + 0x8a5f96d54f3a5981, + 0xed683af54c2a56ed, + 0x6984f3287c2e865b, + 0x3a5f67ba9b31a4c7, + 0x97134abeda26c435, + 0xd837bcffe847d3a1, + 0x63c2a8ffe649d21f, + 0xa5d2b942142aef6b, + 0xb27189c6543e1fd7, + 0xabfd186a91623e45, + 0xe43a5f698f265db1, + 0xd1cb6f4a9d186b2f, + 0x53ed218a9d1c6a8b, + 0xaf16527dca1d89f7, + 0xd3c14ea1fa21c975, + 0xb2a48f143924c7d1, + 0xb5d782e43817d64f, + 0x8efb24c76518f4ab, + 0x37be649ba63d1529, + 0x472a5c9cb41f2395, + 0xd2834ecbade263f1, + 0x261daf9cbce4716f, + 0x3a92e4fed9e56fcb, + 0xa29465321bfa8e39, + 0xfd39ec7327fc9da5, + 0xecb7186657efbc13, + 0xfa19c48765e2da7f, + 0x6c32e89873d4f8eb, + 0x83d9572dc3f81a59, + 0xc48e56fed1fb28c5, + 0x12b9584dcfde5843, + 0xbe46c1a32ed1659f, + 0x51ab46243ce4851d, + 0xd6ace7254ce6a379, + 0xb97de13768d9a2e5, + 0x51bf6dea98edc163, + 0x2d896a38749dbeaf, + 0x18e73d6ba5b3fe2d, + 0xb15d2481f3d51e89, + 0xba27f56213d82cf5, + 0x971b38c651eb4c73, + 0x7e2a69c43ead49cf, + 0xfd37e4876ec1794d, + 0x7df491276cd387b9, + 0x5f4ed81dcad6b827, + 0x3f478c5fe7dac693, + 0x1c56e82ed59ab4ef, + 0x2768d54215afe36d, + 0x3db6789656c413d9, + 0x8be1d6ca95d83247, + 0xed3cab1982d951b3, + 0xcfd14b398eab6f21, + 0xda9bfe198b9c5e7d, + 0x5a7329eedba17ce9, + 0xbc139851f9b3ac57, + 0x75b236e21896bac3, + 0xc2bd841437b9da41, + 0x6dbcfea4348be79d, + 0xf5cb7a87649ef71b, + 0x25e4389cb4c32687, + 0xa65943ddc1b746e3, + 0xf4ec5a1edfba7561, + 0x45c28611fe8a63bd, + 0xc9be8d421d9e823b, + 0x85b3fa654d92b1a7, + 0x863b9df65984aef3, + 0xe983a1765896ce71, + 0xe9fb5da98467ebcd, + 0x3ed8ca7a937afc4b, + 0x486ef2aed38f1cb7, + 0x9826d5a1f1a34b25, + 0x54e6da8432b65a91, + 0xca59f7132e6857fd, + 0xb416e2f43e5c876b, + 0xae5619854b6e95d7, + 0xbec9453bab91c645, + 0xe9842b3dc985d4b1, + 0xd9375e8dc687d32f, + 0xa9cb2d6fe469f18b, + 0x1ba9f684358c21f7, + 0xd9873b15438e2f65, + 0x95146eb872835ec1, + 0xc7539ab98e756c3f, + 0x7c293fd98e476c9b, + 0x69fd5e7bad5c8b19, + 0x238bae4ed94eba85, + 0x5de937b1f962c8e1, + 0xe9ba4fc21963d75f, + 0x4acfb5732746f5cb, + 0x4c2fb739857b1639, + 0x78c5a1da937d24a5, + 0xcf247d1cb28f6513, + 0x264e89dcbe53627f, + 0x19428a5dcd4571eb, + 0xfc87b4dfec378f49, + 0xa652c9821c3a9eb5, + 0xc75f2935495ebd23, + 0xd679ab865741db8f, + 0xabc5ed387643e9fb, + 0xae9f743dc5471b69, + 0xd1a3e7bdc34a29d5, + 0x96bf537fe16d4953, + 0x45f6ad2dcd2e46af, + 0x92a7bfe21f43862d, + 0x96eb82143e25a489, + 0x4a8df3776c28a3f5, + 0x41c7ea398a4bc273, + 0xecb35619873db1cf, + 0xe51f96dba741ef3d, + 0x986c4e3ed6341fa9, + 0xb958d341f5483e17, + 0x5768fcb2152a4d83, + 0x72c34f66512b4adf, + 0xe5c37ab54e1f6a5d, + 0x952caf476e1278c9, + 0xe9c7361bad15b937, + 0xa9512c8edb18c7a3, + 0xa71c98ffe93bd721, + 0x95b6ced1f61ce47d, + 0xa9876d26583214e9, + 0x1e264d5989162357, + 0xbd782faa961852c3, + 0xf781624ba53b7241, + 0x28f13bd76cea5f8d, + 0x15834ae87aec6df9, + 0xafd4592dcbf1ad67, + 0x93f2a16fe8f4abd3, + 0xf156ac4329f7db51, + 0xfe5b319325f7e8ad, + 0x798ed26545ecf82b, + 0x8f9a5c2764ef1897, + 0x4ef8cb6ba5e247f3, + 0xf5b23a1dc2f85671, + 0xe23cfb4bafe864cd, + 0x16e2d4a1fdec834b, + 0x8f6d5c721cde92b7, + 0xc849eaf76be3c125, + 0xec8ba49659d4cf81, + 0xd6a175c546a5bced, + 0xca4ed81874c8fd5b, + 0x5ab4dcea94eb1dc7, + 0x97af58ccb4df2c35, + 0x2c1d9481f2e35ba1, + 0x54da218432d5691f, + 0x8a9467132fd9687b, + 0x96fecd843dcb96e7, + 0xc391e8f54aceb765, + 0x1cd5fb2989b2d5c1, + 0xcb23759ba8b5d43f, + 0x5b28f9ced5c6f29b, + 0x3dab2ec1f6db2319, + 0x74b6a1c326cd3185, + 0x97c6deb653ae4fd1, + 0xd5ce149871b26d4f, + 0xc6bfd8e65f946dab, + 0x7fd48a176eb78c29, + 0x8b6ad3987d8cab95, + 0xf786b5edc78db9f1, + 0xba371f8fe7a1d86f, + 0x72e4a5b21793f6db, + 0xbdc68e2436c81749, + 0x2f6815e874ca26b5, + 0xa5dc48ba94bd5623, + 0x7f1e48da91ae538f, + 0x3b61d92bae9372fb, + 0x6384f7aedeb5a169, + 0x9ca15fdfeb879fc5, + 0xb4ac87221c8abe43, + 0xd5f63e73276dbc9f, + 0x2c36b7865782fb1d, + 0x5e9bad1986a41c79, + 0x93a21e5cb4972ae5, + 0xe9ba823ed29b4a63, + 0x95bef2ced18c47bf, + 0xb54f31adce8f673d, + 0x47da25f21f7285a9, + 0x9a47fc143e96b517, + 0xb9f137a65d79c483, + 0xcfe4b2165869b2df, + 0xa6825bda987ce15d, + 0xb2c1976ed78321c9, + 0x987cfe4ed6953f27, + 0xbe63d1c1f2874e93, + 0x4a732e5212684bef, + 0x486ad9c4317c5b6d, + 0xdfe641543e4f6ad9, + 0xa5d4cbe98e62ba47, + 0x5ca36bda9d65c8b3, + 0x478f3d9dcb69d831, + 0x8673ae1dc74ae58d, + 0x724a5f9ed65ce4f9, + 0xc24e57643a912467, + 0x8efd46a3278654d3, + 0x73594dbba4897351, + 0xfa5ebc69825961ad, + 0x4ae5d7398e4c7f1b, + 0x16d5493bac3f9e87, + 0x17bca6fedb52ace3, + 0x61ba3ce1fa45dc61, + 0xa26fc9e21836e9bd, + 0x51fd6c83274af93b, + 0x213ebd46564e19a7, + 0xe8a9f3ccb8724915, + 0x87d29afdc3645781, + 0x6849172cb13765ed, + 0x56bc328edf2a845b, + 0x7e51da41fe2d93c7, + 0x65af2cd21d4fb235, + 0x21fc95d76c54d2a1, + 0x8cf3d1265824befd, + 0x8c9176465827fe6b, + 0xbf3ea57a963a1ed7, + 0x289765ccb73e2d45, + 0x13fc698fe6425cb1, + 0xd84cfa1fe1346a2f, + 0x8ec716f43125698b, + 0x58a47be43e1a98f7, + 0x7e8263c54e1db875, + 0x1c96eb487a2fb6d1, + 0xfb7386aa9a12d54f, + 0x38bd65adc815f3ab, + 0xab768d1fe83a1429, + 0xa195e721f71c3295, + 0x619e5bf5473d52f1, + 0xbf8ac9e874216e5f, + 0x5e916c8872136ecb, + 0xacf53d876ef58d39, + 0xf95a8cb76df79ca5, + 0xe5c7f49989facb13, + 0x84c195eba6edc97f, + 0xae54126dc6d1f7eb, + 0x86ba79e32af41859, + 0x2a6584d436f827c5, + 0xa67cde1986fb5743, + 0x65312cf872ec549f, + 0x81245aba92ef741d, + 0xe539d7ccbfe3a279, + 0x3da127fcbcd6a1e5, + 0xf85946bfead8bf53, + 0x5fe86ba217c8bdaf, + 0xeb294da437abec2d, + 0x2bd7369657e21d89, + 0xcaf5e93987d42bf5, + 0x45fbd12ba5e84b73, + 0xf379148ba2d948cf, + 0xc72653dcb1ec684d, + 0x12c5634edecf76b9, + 0x82eac9321fd3b627, + 0xdb459c832ed6c593, + 0xe1b5ac7549a7b3ef, + 0x12f94bd658bae26d, + 0xc5ae4b3876acf1d9, + 0xb3421d7dc9d23147, + 0x6184c75ed6c54fa3, + 0xc795e611f4c86e21, + 0xcdb93e8212b95c7d, + 0xf1957e4431ac6be9, + 0x4b7a9c643eaf9b57, + 0x92b1a8e76ea2b9c3, + 0xed43b1298cb6d941, + 0xa9c7483cb8a7e69d, + 0xb4c56f8ed79af61b, + 0x156b3d81f6be1587, + 0xbd3917a328b145e3, + 0x1bdac54438c57461, + 0x3ab9ec4653a762bd, + 0xfd2a19c872ca813b, + 0x26183cf65e6c8f97, + 0x3467a9e98b7e9df3, + 0x8ac67f9feb93cd71, + 0xc2a6d7e1f874eacd, + 0xcd4b98721987fa4b, + 0x5a276dc4368c1ab7, + 0x715debc7679e3a25, + 0x63fce75ba6b25891, + 0x7be5284ba29356fd, + 0x46e89baed1a7856b, + 0xf436de1dcf6a94d7, + 0x8964e711fe8db345, + 0xfbc931632d7fc3b1, + 0xae9c72665b84d12f, + 0x24a815b43964ef7b, + 0x8cd2479659681fe7, + 0xc25b9e3ba78b2e65, + 0xbe46d87ba57e4dc1, + 0xafec596ed4816b3f, + 0xb2749a81f1736a9b, + 0x57f4e2a432768a19, + 0xda8c53432f4ab985, + 0x83abd5e54d5cb7e1, + 0xd28b6fa87a4ec65f, + 0x42c56d398962f4cb, + 0xbc42983edb871539, + 0xc46a238fe87923a5, + 0x1a87ed21f78c6413, + 0xdae98f63246d517f, + 0xc2e6b73543516fdb, + 0x35bac19871638e49, + 0xecabf8287f369db5, + 0x1ad267c98e59bc23, + 0x6c185ae8793bca8f, + 0xeb6c2d3ba73ed8fb, + 0x153d72b1fb531a69, + 0xd3f894721a4628d5, + 0x4b381963296a4853, + 0xf5483d28763b45af, + 0x71a648ba934e752d, + 0x6d3be7adc251a389, + 0x9e75634cbe34a2f5, + 0x471c2beede48c173, + 0x72ba831ed927aebf, + 0xf4375bd2192ace3d, + 0xfbd6a4c4372efda9, + 0xadce39798a543d17, + 0xe1943c6ba9264c83, + 0x9bd74f2ba52749df, + 0x7f854a2dc32b695d, + 0xa25f6beed12e67c9, + 0x91db864fef21b837, + 0x61e35a732f14c6a3, + 0x39d287165e38d621, + 0x24879fd65b19e37d, + 0x75c9dba7681bf2e9, + 0x2341aedcba3f1257, + 0xcf29ab7ed92451c3, + 0xc36921bed8276f31, + 0x134dc6b1f3175e8d, + 0x15ec9763231a6cf9, + 0xc5792a85421e9c67, + 0x8eb92ad54cef9ad3, + 0x6afbcde87cf3da51, + 0xe438a1c769f4e7ad, + 0xc1fbd32ba9e8f72b, + 0xc978e4aed8fc1697, + 0xbe3a5f6dc7ed26f3, + 0xf25671a439f26571, + 0xf1369cd325f463cd, + 0x7ae195b763f7824b, + 0xa317fe5762fa91b7, + 0x6ba2e5887edcaf15, + 0x326f5c887acfbe81, + 0xb182c3aa98a2cbed, + 0x5fa19b3fe8d4fc5b, + 0x1ecd4b8329e81bc7, + 0x2f9e5b6548ec2b35, + 0x2fde791656de49a1, + 0x5b6f1e8a95d2681f, + 0xbf741c8ba2e3867b, + 0x16ac83dcb1d695e7, + 0xa47891fdcfdab465, + 0xd31c2561feadb4c1, + 0xce78df521baec23f, + 0x8f25b9a54ac3f19b, + 0x85ca7ed76bd73219, + 0xd59ebf8768c92f75, + 0x7194bcd986ba4ed1, + 0x628ae1da93ad5c4f, + 0xdc23a71fe3d16cab, + 0x6cb53d41f1d48b29, + 0xad35741321d6ba95, + 0x1a452bd43ea9b8f1, + 0x8cfeb1543d9bc76f, + 0xd79ec235498fe5db, + 0xf63ced7babc31649, + 0x216f975ed9c724b5, + 0x39f12d8fe8ca6523, + 0xf8c6423fe4ab528f, + 0xdf1ba893249d61fb, + 0xeba982f543b18f59, + 0xb59e347761a39ec5, + 0x4819bd276f97bd43, + 0x28bed7665d67cb9f, + 0xfbae2c39897bea1d, + 0x346f195dc86efa79, + 0x1235da91f8a329e5, + 0xf695b2c21ab74963, + 0xbdeaf6c3259846bf, + 0x238efcd6549b763d, + 0xabdfc157628e74a9, + 0x31d2a67dc3a2b417, + 0x36fda2ecbf95c283, + 0x6e3bd54bac76b1df, + 0x3c5b9d8fea68cf4d, + 0xb4ec29a2185afeb9, + 0x9f31d6c54a8f1e27, + 0x9ca57b376a824d93, + 0x32fd475986754aef, + 0x2814af7cb3785a6d, + 0x728d1a6dc25b68d9, + 0x685b371ed16ea947, + 0x5649183fef61c7b3, + 0xb59837d32f85d731, + 0xbfea9d432c56e48d, + 0x986f1c554b58e3f9, + 0x835d216a9b8d1367, + 0x8fcd9e1ba97f42d3, + 0x35f7a12eda947251, + 0xae81692dc3645f9d, + 0x1347b5d1f3587e1b, + 0xb273d6e2124b9d87, + 0x21bf7955415d9be3, + 0xd65b8ea87f52db61, + 0x2ea375c76c43e8bd, + 0x7e281f3a9c46f83b, + 0x685fc2aedc4b18a7, + 0x75b892afea6d3815, + 0x9fd714cfe95f4681, + 0x6c4da9f2185264ed, + 0xe734afd32746835b, + 0x23c45787634892c7, + 0x54d1bfea926cb135, + 0xc25e8bd87e3dbf91, + 0xeb3cd7598a31bcfd, + 0xfde3b42dca23fd6b, + 0x46d89ba1fa361cd7, + 0x495e6ad21b3a2c45, + 0xbf91e366583d4ab1, + 0xd5c3b147673e592f, + 0x5bd4e73ba532678b, + 0x51389d4cb32496f7, + 0x6184c2aed129b675, + 0x62f1be7dcf2ab5d1, + 0xd64a85cfeb1dc34f, + 0xf87ec3254d31f2ab, + 0x239ea4d87d461329, + 0xfb63ed287c283195, + 0xed53416878294fe1, + 0x21ca873a971b4d5f, + 0x576fceba941f5dcb, + 0x7469d2bfe5128c39, + 0xb8a67231f2149ba5, + 0x73e61c465428ca13, + 0xe7c5d4932de9c87f, + 0xa695f14439fad6eb, + 0x9b8e3a254adef659, + 0xd758326a9af326c5, + 0xd94e175dcaf85643, + 0x45a68d9dc6e8539f, + 0xcf75284fe5fb731d, + 0x619a3fe324fe8179, + 0x5e28a73543e19fd5, + 0xdf54be6871f4be53, + 0x6c3852b54ed5bcaf, + 0x32145cd76ac8eb2d, + 0x542ab38767dcfb89, + 0x29d3175cb8ce1af5, + 0x72b468a1f9e24a73, + 0x7ba46e8218d547cf, + 0x85f9d47325e9674d, + 0x7e1c38a543ec75b9, + 0xea1cb9f983dea527, + 0x29d4c86ba2e1c493, + 0xf61274b98da4b2ef, + 0x95f3be7bacb7e16d, + 0xfe93ac8ed8a7efc9, + 0x7fd4a1c32abc1f37, + 0xe2b5da9548bf2ea3, + 0xd2caf81879c46d21, + 0x39eb4f1986c45b7d, + 0x21f73e5983c76ae9, + 0x63f9148cb2dc9a57, + 0xb2f169ced1bea8c3, + 0x5bda649fefb2d841, + 0x294a5ec21fa3e59d, + 0x6d71e9c43da7f51b, + 0xbf7361a65dcb1487, + 0x32dba19879ac24e3, + 0xe4d39c6ba9bf5361, + 0xda5b63fdc7a361bd, + 0x37218f6ed4a57f2b, + 0xa263b891f2b68e97, + 0x2da483f2128a9cf3, + 0x9fb3ae15429ebc71, + 0x529a67154f71e9cd, + 0xa934f1276d83f94b, + 0x4e39ad698da619b7, + 0x689a7ecedcab3925, + 0x1c78ad5fe8ad4791, + 0x571a96fdc68e45fd, + 0x6a823f7217a2846b, + 0xf415dce324a593d7, + 0x6cb84a9873a9b245, + 0xe615d3c8738ac2b1, + 0x4918af587d6cbe1f, + 0xb853671a9c61fe7b, + 0x4857b9edcb841de7, + 0x7346d911fb982d65, + 0xc5f917432a794bc1, + 0xd8a9be33287c5a3f, + 0x156c7ed4346f589b, + 0x975a86dcb573a819, + 0x32e7f6ddc294b785, + 0xf48913adc278b6e1, + 0x6ae8397cbe6ac45f, + 0xb9352861fa5de3cb, + 0xe4c762965e821439, + 0x2dce3b654d8632a5, + 0xfb4eca887c896213, + 0x5dc91a2878594e6f, + 0xd421e9b9864a5edb, + 0x45c97f2cb35f7d49, + 0xdc68a42fe3629cb5, + 0xe53a12d1f176cb23, + 0x5fe19d832146c98f, + 0x85f493732e39d7fb, + 0x19e8bd354c3df769, + 0xdc183afa9c6127d5, + 0x3e25c14cbc864753, + 0x67b8921dc93754af, + 0x934fb76fe85a742d, + 0x134d9e51f54d7289, + 0xdc75afe3264e91f5, + 0xc14fb6887452bf63, + 0x1c9b58f76134adbf, + 0x254c71a76f27ec3d, + 0xfda172c76d28fca9, + 0xb7ce3f1bab4e2c17, + 0xbf2a54dfec514b83, + 0x35fb681fe92348df, + 0x32eb98f21a27685d, + 0xa2756cb4352a76c9, + 0x91c625d9852da637, + 0x49a53279842fb5a3, + 0xfa582c4cb364d521, + 0xc8f9d72baf15e27d, + 0x9cef13acbc27f1e9, + 0x9168b3a1fd3c2157, + 0x2a6759854a1d2fb3, + 0x2a1f4de87b426e31, + 0x2c4f153769135c8d, + 0x1e5caf7987156bf9, + 0xd4713f6dc41a9b67, + 0xc1e4857cb41ca9d3, + 0x91e458aed32fc951, + 0x346eac8cbcf1e6ad, + 0x9a3f2d821de4f62b, + 0x7fb968243df81597, + 0x4d57f8276bea25f3, + 0xc1e47f598afd5471, + 0xc57a6ef987ef52cd, + 0xfe3bd89dc7f3814b, + 0x3d814a2dc3e48fa7, + 0x9be1273ed3f8ae15, + 0xdf39c4e323fabd81, + 0x9be64ca431fcbaed, + 0x8235b1954ed1fa5b, + 0xa8342f176de41ac7, + 0x7854f21a9ce82a35, + 0x75924d8dc9eb48a1, + 0x8d921f6cb8dc571f, + 0xf7b1c2afe4df657b, + 0xfdb32c5216d294e7, + 0xf67c48e324e7b365, + 0x5f94a12764e8b3c1, + 0x62fab19872dac13f, + 0x2ba6cf765e9cdf8b, + 0x58427fca9cb21ef7, + 0xeaf5128edbc42e75, + 0x62dab491f9b74cd1, + 0xa65d472218c95b4f, + 0x7f8db53326cd59ab, + 0xce86f29545cf7a29, + 0x41a58f6874d2b895, + 0x8d54fbea93c5b7f1, + 0x45f138dba1b8c56f, + 0x9cb7ef5baf89e4db, + 0xa6bc3f5fecadf349, + 0xdbc2f5354ec123b5, + 0x63aebc965dc76423, + 0xe2d16f954ab7518f, + 0x86fb9c5546985feb, + 0x71cdafb984ac7e59, + 0x834fe2cba39f8dc5, + 0x649bda3fe5a2bc43, + 0xabc9712fe184ca9f, + 0x1e4ba5f432a7e91d, + 0xc5a1de432e6bf879, + 0xefd1a3554c9d18e5, + 0x31daf28a9db14863, + 0xcb3aef598a9345bf, + 0x864bfe3dc9a8753d, + 0x5f967c4fe58b73a9, + 0x53b671e1f59da317, + 0x67a5bd43259fb183, + 0x5937af254372aecf, + 0x3dfb2a876185ce4d, + 0x913257654e56fdb9, + 0x8ec24d6a9e8b1d27, + 0xc695d2fbab7e2c93, + 0x8ad4fe7dca7149ef, + 0xc581b491fa83596d, + 0x5e73d6421a8567d9, + 0xcf85ad63256ba847, + 0xa896f376547da6b3, + 0x2c41ebda948fc631, + 0x893c26eba172e38d, + 0x82341b5bad65e2f9, + 0x4758631ede8a1267, + 0x97a48651fc7b41d3, + 0x94d17fb32b7d5f41, + 0x86fb52143a615e9d, + 0xb27f34c659647d1b, + 0x8b92c7fba6459c87, + 0x9ea4c6dcb4589ae3, + 0xea14d62cb35dca61, + 0x5962d48ba14fc7bd, + 0x63fe784ede52f73b, + 0x815c39f32f4516a7, + 0x63ae82b54e6a3715, + 0xcda95f887d6c4581, + 0xb56834c8794c53ed, + 0xbd256e7dca61825b, + 0x568237eed85491c7, + 0x2f56738ed647af25, + 0x368adc41f348be91, + 0x3e568cf21239abfd, + 0x5df8b295413fec6b, + 0x73c18e276f431bd7, + 0xef3675da9e372b45, + 0x8b4612dbad3849b1, + 0xd72358adca3b582f, + 0x41b2e97ed92e568b, + 0xf8c17a6fe83195f7, + 0x9bd378e21923b475, + 0x9fda38765637b4d1, + 0xc123be487539c24f, + 0xac21fe38723ce1ab, + 0xcd859e187c2def19, + 0xa3291e7cbd132f85, + 0xf854aebdcb264de1, + 0xd74f9a1fea184c5f, + 0x1bf3ad9328195acb, + 0xe78f1bc5481e7b39, + 0x5c9248176721b9a5, + 0x25c7e84ba725c913, + 0x524e138ba315c67f, + 0x38dc945ba218d5eb, + 0xfe457d9badebf459, + 0xf4327e5edbfe14c5, + 0xa1e643932df16543, + 0x7e256ac43be4529f, + 0x9af3ed765af8721d, + 0xd9ec163545ea7f69, + 0xda96354874fb8ed5, + 0x5746f1aa94efad53, + 0xd4ec352a93e2cbaf, + 0x9568a71dc1f5ea2d, + 0x8bad4f3321e6fa89, + 0x4b27f8543edb19f5, + 0x2afd14b65cde2973, + 0xf49a82687ad146cf, + 0x62fe8d4a9ae3764d, + 0x5dfa872dc8e674b9, + 0xa376c49ed6eba427, + 0x83d64c11f5edb293, + 0xf597c48324bda1ef, + 0x65e39cd543b2cf5d, + 0xf3821cd651b4fec9, + 0x37fae2b76fc91e37, + 0x61fb5ac87ecb2da3, + 0x8fb134da9abe5c21, + 0xac47913fe9c15a7d, + 0xb5173c61f7c368e9, + 0xab25948218d6a957, + 0xd81ef9b325d9a7c3, + 0xe47b89c765bdc741, + 0x1298e73762afc49d, + 0x36a2fcba92c3f41b, + 0x3df6291cbfc61387, + 0xef143a2dcdb942e3, + 0x9742aeb1fdbc5261, + 0x92ba45c2198c4fad, + 0x8c9b2ea549a17e2b, + 0x95dfae3546b38d97, + 0x3a4921c875a69bf3, + 0xc62df97984a9cb71, + 0xab6fd2ea927ab8cd, + 0xfdb8746dc19fe84b, + 0xa1c879dfefa318b7, + 0x7a4b29c21fb73825, + 0x6298ec543eba4691, + 0xa765f4d43b8a54fd, + 0xc42fe7a65a9e736b, + 0xf4e3d5acb8a192d7, + 0x4e612b8ed8a6b145, + 0x367b892ed486bfa1, + 0x9f1c5b6fe378bd1f, + 0x2795da82126aed7b, + 0xa19d6eb4316dfbe7, + 0x4b8df9c87f932c65, + 0xe96adb487e864ac1, + 0xb17d238bac78593f, + 0xcf6a187eda6c579b, + 0x9fc65e4eda6e8719, + 0x48b17da1f791b685, + 0xf36a4d132784b5e1, + 0xdca81e532487c35f, + 0xa7d498b65368e2cb, + 0xcd436259827cf139, + 0xd8234aca9e7f21a5, + 0xc8524dfbac734ef1, + 0xb9d815fdcb754d6f, + 0x6d927e11f9475cdb, + 0xeb5fad721a5b7c49, + 0xafb157e3274e8ab5, + 0x928bea776871ca23, + 0xc7b6815a9453c78f, + 0x7163425a9245d6fb, + 0x4e6d581dc14af569, + 0xc3a415dcbf4c16d5, + 0xbf34a95fed7f2653, + 0x5cef86221d6253af, + 0xca8537154c56732d, + 0x4d31cf965c4a7189, + 0x4e3d9877673a8fe5, + 0x36127f8a974dae63, + 0xfeb3278a9541acbf, + 0x69a2f87dc254eb3d, + 0x1fd6a58fe135fba9, + 0xa96b7ef5435a2b17, + 0xa9cf84765f4d2a83, + 0x16ecaf365b2e37df, + 0xca3e78ba9c32675d, + 0xb491623bab2475c9, + 0x92f3657edb29a537, + 0xa28bd67fe72cb4a3, + 0xa46e5281f75ec421, + 0x1fd847943642e17d, + 0xc4713df65423efd9, + 0x178b35ca92381f47, + 0xa95f26b87f192eb3, + 0xcf4b861a9e2c5d31, + 0xd36c425a9a1f4b8d, + 0x85bc12eedb126af9, + 0x347a5181fb149a67, + 0x86bad4932917a8d3, + 0x2e7985f5472bc851, + 0xb8f3e7d7641ec5ad, + 0x275bca8a9631f52b, + 0xbd9a6f4dc3251497, + 0x187f49bbade724f3, + 0xae68bdfdcdfa5371, + 0xd45fa29fe9fa51cd, + 0x25e4b97219ed6f3b, + 0xf5d86ae439f18ea7, + 0x92bd5ec768f4ad15, + 0x359edb4875f6bc81, + 0x42fa9ce763f7b9ed, + 0xb251d7e982fce95b, + 0xe659d74ba1def8c7, + 0x4198bc5edfe42935, + 0x8c13e6432fe647a1, + 0x6b152fa43cd9561f, + 0xfbc4a7d43aec647b, + 0x78ac2e6659cd83e7, + 0x7314f9cba9e1b265, + 0x619c235ba7e5b2c1, + 0x4165bd2ba4c6be2f, + 0xd6eb5741f2c7de8b, + 0x84e9756212baecf7, + 0x53ce189542cf1d75, + 0x83214df76fc34bd1, + 0xdc4e5a987dc65a4f, + 0x74eb3a276cd758ab, + 0x5ce7312cbadc7829, + 0xf1ba587ed6cea795, + 0x43f682afe7c2b6f1, + 0x8236bc4217b3c46f, + 0x14fbea9324a6e3db, + 0xe3af275763caf249, + 0x7d46bc5983cd12b5, + 0x48ce2b3a9ebf5123, + 0x4a53bf2a9ca24e7f, + 0x4158fb9dca945deb, + 0x37d59e11fab87d59, + 0xc2564392179a8bc5, + 0x76819c43279eab43, + 0x17c2f9d545a1c89f, + 0xde6528a875a4e81d, + 0x816be53ba2b5f679, + 0x7da12fbdc2ba17e5, + 0xe38647fdcfad2763, + 0xe258a1bedc8e34bf, + 0x43fcd7821ea2743d, + 0x15c64ae43db572a9, + 0x6a4291865cb9a217, + 0x2784ade6568baf73, + 0xe18acb28746b9dcf, + 0x9d537e6ba581ec4d, + 0xba76f43ed273fcb9, + 0xc4b16981f3a81c27, + 0x5d7861e5418a2b93, + 0xc6934fd32d6b38ef, + 0x6e481ad43c7f486d, + 0x671f4e365c8276d9, + 0xad84321cbc95a647, + 0x4758a92ed978a5b3, + 0x183fd5afe78bc531, + 0x1b8265a1f46ec28d, + 0x26cf71543572e1f9, + 0xf6a572b984a52167, + 0x9f412b7761872fc3, + 0x461a53298f7a5e41, + 0x85a4dbf87e5b4c9d, + 0xa271dcba9a5f6c1b, + 0x839c21bfec529b87, + 0x9e532b41f865a9e3, + 0x639fdec32a58c961, + 0x6c3784e32549c6bd, + 0x1ab946c8745de63b, + 0xf95cea6cb48215a7, + 0x5aed372dc2973615, + 0x7a8bf23dcf695481, + 0xeda4567cbc4952ed, + 0xe4982161fc4d715b, + 0x52f9eca21a3e6fb7, + 0x7caeb1354b63ae25, + 0xc841d7276845bd91, + 0xb5c129e87536bafd, + 0xfe531ac98439ea6b, + 0xd2e6b9fba23cf9d7, + 0x57c1b23fe3712a45, + 0x7492c56fef3548b1, + 0x327fc4d21e38572f, + 0xe6fb71a43e2a658b, + 0x49783a165b2c84f7, + 0x3617fed98b2fa375, + 0x52ec7b3ba954b3d1, + 0xcde3295cb836c14f, + 0x9fe165ddc426df9b, + 0x3abf85ced43afe19, + 0x4bfd1e63243d1e85, + 0x5de9642873524ce1, + 0xe14983b87e134b5f, + 0xbfac39887e1659cb, + 0x9bcd1e398d1b7a39, + 0x9d6e8a5dcb1d98a5, + 0xeb731c2ed92fb813, + 0x5b37148fe812c57f, + 0x71965fe32715d4eb, + 0xa2639c854618f359, + 0x6df7acb9862b13c5, + 0x239bd78ba61e5243, + 0xefa145b87cde419f, + 0x5d2943198ad25efb, + 0x93246d8dcbf47e69, + 0x18fa246fe9f78cd5, + 0x65f7ced218fbac53, + 0xa68b157325edb9af, + 0x8bfd124656f1e92d, + 0x481932a764e3f789, + 0x5db4126ba3e718f5, + 0xe412763dc1fb2873, + 0x1f4365da9edb35cf, + 0xbd6f5a1febcf654d, + 0xf9ae76c21de273b9, + 0xd269e8b54ce6a327, + 0xa7b43fd65ae8b193, + 0x567ea28545b89edf, + 0xc62de51874acbe5d, + 0xde1afb9984b1fdc9, + 0x6bdaf14dc4e51d37, + 0x981275d1f1e72ca3, + 0x615cda7543ea5b21, + 0x3471a9532fbc497d, + 0x649cb1743cbf57e9, + 0x3572cd176cd2a857, + 0x7cabefd989d5a6c3, + 0x7a1d856cb8d9c641, + 0xb3c15f8fe5bac39d, + 0x731dc8e1f5ade31b, + 0x6dcafb1546d31287, + 0xa1965df875c641e3, + 0xd1b38fa872c84f51, + 0x8b6a9ce65f984ead, + 0xce598ad87e9c6d2b, + 0x59ec6fb98baf6c97, + 0xc4912a6ed8b29af3, + 0xa3d819c1f8b5ca71, + 0xb3afc7d21596b7cd, + 0x9ef74533259ae74b, + 0xea39cb25439df5b7, + 0x169cfbdba6c13725, + 0xe9c2418cb2c64591, + 0x365c87fbae9753fd, + 0xfec4896ede9a726b, + 0x47cb3191fb9c81d7, + 0xfec52b821b8e9f35, + 0xed71fbc54983bea1, + 0x6c3f5ea54785bc1f, + 0xb64d8fe65486ec7b, + 0xa4c5d9698369fae7, + 0x3d168efdc39e1b65, + 0xc927d43fe3a249c1, + 0x91a6cb8ede94583f, + 0x5ae24b821f87569b, + 0x759e8b143e7b8619, + 0x7c826ed43c7da485, + 0xac4b9d37697fa4e1, + 0x9b63712ba983c25f, + 0x3c168d9ba675e1cb, + 0x12fdb83dc467ef29, + 0x7caf4b9fe37b1f95, + 0xce56f4b3247c3df1, + 0xe3b78a1652814c6f, + 0x65fab9354f635adb, + 0x9c23df698e567b49, + 0x1b9a34c87d4a89b5, + 0xe8d2374dca6db923, + 0x5192fa4dc74eb68f, + 0xc2f154afe762d5fb, + 0x6f3459d21875f469, + 0xfa27b414367914d5, + 0x21caf68a968c2453, + 0xd9217eb9816d42af, + 0xc796bd2baf63712d, + 0x4361f7dcbd436f79, + 0x21d7b43dcb368de5, + 0xe2d1b581fb49ad63, + 0x6a8f5b92173c9abf, + 0x1bcd67f3274fca3d, + 0x68e941265642f8a9, + 0x16924c3cb8562a17, + 0x4abf583dc45a2983, + 0xfc7642dcb14a36df, + 0x15ce83dcbf2e465d, + 0x56d34b11fe3174c9, + 0xd2948e521e25a437, + 0x8f6a12c65d47b2a3, + 0x4c963ef87b5ac321, + 0xef23d8a6572abf6d, + 0x4e3c86d8752fced9, + 0x328a567dc8531e47, + 0x689137ffe5462db3, + 0x3bce1d71f2495c31, + 0x18b942c4312b4a8d, + 0x2c5e1f843e1d58f9, + 0xfde629165e21a967, + 0xa2d643798c14a7d3, + 0x7dfe438bab28c751, + 0x853ad2ecb718c4ad, + 0xb56c89aed71ce42b, + 0xaf59eb2ed51ef297, + 0x12bafc57681542f3, + 0x4eadc35a96385271, + 0xf2cd1ae762174fbd, + 0xebf837c65df96e3b, + 0x8d2f3ca65bfc6da7, + 0x6195fed98aef9c15, + 0x68327c5ed9f3cb81, + 0x2e56374dc6f4b8ed, + 0xf8cb24e216f7e85b, + 0x6fad83e324eaf6c7, + 0xcf2186d876fe1835, + 0x7ca14dea95f246a1, + 0xb86e2d3ba2e4651f, + 0xcfb4825bafe8637b, + 0x7cf1d95cbcda82e7, + 0xaced7831fbeda165, + 0xe487dc3328ce9fb1, + 0x16f3de8548c3bd2f, + 0xb8f5a1c436c4ed8b, + 0x1496ca8654c6ebf7, + 0x1e54c7aa94eb1c75, + 0x512ad4ca94ce3ad1, + 0xda174e9dc2d1594f, + 0x576ac24fefd357ab, + 0x5823e6d21fd68729, + 0x419a8d732edba695, + 0x1db6738549bca5f1, + 0xa82c46f658aeb36f, + 0xe3dc2bf987a3e2db, + 0x6a73cfecb7c6f149, + 0xb79df53fe6d921b5, + 0x15683dcfe5cb4f13, + 0x2a859bd212ac3d7f, + 0xcfe7389542a15ceb, + 0x1a286be54fb37c59, + 0x6fa9ce254eb68ac5, + 0xb13f5a487dc9ba43, + 0xbdfc397ba68cb79f, + 0xf6a7e85cb69fc71d, + 0x28765bffe6b2f579, + 0x6389fac328b716e5, + 0x87532bc547ca2563, + 0x14db2797629a43bf, + 0xe39a1fb981ae623d, + 0x3baf4c698fb271a9, + 0x591438bbac938ef5, + 0x3869baeedc96ae73, + 0xd391b67fe8679bcf, + 0xbac475e2187acb4d, + 0x64a37dc3256feab9, + 0x4185da7768a41b27, + 0x59d1eaf985b62a93, + 0xd215cbfba29837ef, + 0x41a2df6dc19b476d, + 0x239761acbf7e65d9, + 0x7ec8b6d1fe91a547, + 0x5ec6b8a21e85a4b3, + 0x83ec1fd65d98c431, + 0xbd2561e54a69c18d, + 0xb967adc5465acfe9, + 0xf723d4ca946dfe57, + 0x349251ecb6842ec3, + 0x2178af3fe3975d41, + 0x76d59a41f1674b9d, + 0x825db414327c6a1b, + 0x5974acf32f4e6a87, + 0x46ab9c765d61a8e3, + 0x647cf3ea9d74c861, + 0x925eb6398946c5bd, + 0x5e2dab4dc869e53b, + 0x658217eed65cf3a7, + 0x941abd6fe78f2415, + 0xc8f6974327945381, + 0x3e18a655437651ed, + 0xfec58a2871586f4b, + 0xc8d4f3e65f3a6eb7, + 0x3d2c41998c4e9d25, + 0x18c7d5fbad52bc91, + 0x3b9852fdc843b9fd, + 0xc6a127d1f835e96b, + 0x7fc9b3d21639f8d7, + 0x7b2e64c4386d1945, + 0xd2c974a9865f37b1, + 0x6c23f57ba473562f, + 0x8f5b2e4dc135648b, + 0x82a7e45cbe2983f7, + 0xf1c275eede3ca275, + 0x86712c41fb4ea2d1, + 0x1965fcb32a41be3f, + 0x982afc154823de9b, + 0x2ab918f65836fd19, + 0x865fa2ca973a1d85, + 0x8e23a1ca964c3be1, + 0xa4d3ef5cb42e3a5f, + 0x8295cdafe13258cb, + 0x496b831fef157839, + 0xe1754fc32f1897a5, + 0x62b98a165e2cb713, + 0x81def3265a1db47f, + 0x1a4d26987921d3eb, + 0xe792f4acba14f259, + 0x53b4f12ed93812c5, + 0xfb7d458fe82b5143, + 0x59f137eed41b3e8f, + 0x3ea75b63231e4dfb, + 0xafd4b29653127d69, + 0x61f8edb54ef38bd5, + 0x274c91d76df7ab53, + 0x4387eb1659e7b8af, + 0x21a7e35a97fbc82d, + 0x8f13ae9cb5dfe689, + 0xc1768b2ed8e317f5, + 0xc473d95219f82673, + 0x5fa4ceb325e834cf, + 0xe3f815b872fb634d, + 0x9c46b2a871fe62b9, + 0xaf5e73ba9fe3a127, + 0xa713ceba9cd4af83, + 0xb96437dba8b59cdf, + 0x6c5281d1f7e8bc5d, + 0x83f2ea6216daebc9, + 0x57d91ab326cefb37, + 0x758cb2f767e42ba3, + 0x4ef8b36a96e75a21, + 0xfb3d482ba2e9487d, + 0xf81b973ba1db56e9, + 0xdf76953cbfce9657, + 0x43ebd291fed1a5c3, + 0x3157bd932ed6c541, + 0x8af96c443ab6c29d, + 0x1dfa8b4658c9e21b, + 0xe7d3698545abef67, + 0xa9cd2b3986ae1fd3, + 0xc32a47dcb7c34e51, + 0x8ba9712fe2b54cad, + 0x54169721f1d86c2b, + 0x1a48d3f321dc6b97, + 0x634cf9b32ead89f3, + 0x1f8da6c65eb2c971, + 0xf739cb465a93b6cd, + 0x93bd7e2989a7e64b, + 0x875d1f3dc6a9f4b7, + 0xda78b43fe8bd1625, + 0x493fa16fe6bf3491, + 0xab96d4e216a352fd, + 0xfdcb692543c5716b, + 0xea7dc1b541a86fc7, + 0x48fe5ba76f8b9e35, + 0xc5e734f76c7e9da1, + 0xb2d7a31a9a82cb1f, + 0xacf3648ed983ea7b, + 0x769c231ed685f9e7, + 0x47dc8933289b1a65, + 0xfead8b65469d38c1, + 0x857e32c7659e473f, + 0xc32e54f983a2659b, + 0x8a16b54dc2b68519, + 0xab19273dcf79a385, + 0xb13ed56dcd7ba3e1, + 0xa6b89f3fea7db15f, + 0xa37159632961dfab, + 0xd98741b43a74fe29, + 0xe61cf9a54a871e95, + 0x6d72b95986793cf1, + 0x38a652ca947c3b6f, + 0x7d5f124ba26f49db, + 0xfc85613fe1827a49, + 0x129a346fef6498b5, + 0x5cdf27421f69b823, + 0x67e8fa532d4ab58f, + 0x6714fc24395dc4fb, + 0xb4fd92e98b71f369, + 0x5f791e2cba8613d5, + 0xe42bf31eda894253, + 0x623e791ed56941af, + 0x218369dfe36b5f1d, + 0xb4ce7962124f5e79, + 0x8e35f76541628ce5, + 0xb296a4f87f45ac63, + 0xfb37d2e65d36a9bf, + 0x9e6b53887b4ac93d, + 0x142dc3fcb83de7a9, + 0x915adf7feb632917, + 0xa97c82b1fa652783, + 0x7ae9f842184735df, + 0x6bcade73273a645d, + 0x236a1ef8724d63c9, + 0x8475e26ba15f9237, + 0x7ab5286a9f54b1a3, + 0x9cd512398b249def, + 0x25d4e16dca27be6d, + 0x2e98b7a1f728ecd9, + 0x4a52f982192dfc47, + 0x53b197f769512cb3, + 0x6139c2b989465b31, + 0x71cb68dba526498d, + 0x9c1e4a7cb32a57f9, + 0xb6d3f95dc12d9867, + 0xa671cd2cbe1f96d3, + 0x5bd391a1fe23c651, + 0x5bd7fc332e15c3ad, + 0x2ad8ec365c18e32b, + 0x49fe63165a2bf197, + 0xfad36519894d21f3, + 0xe974f1acb9324f61, + 0xd1b73e5ba6134ebd, + 0x58df2b4fe4176d3b, + 0x3c1729e1f2196ca7, + 0xb56c1e35432d9b15, + 0x64eac2d43dfeba81, + 0xc673dbf54af1b7ed, + 0xeba13f276af3e75b, + 0x7ade29f989e6f5c7, + 0x41eb637dc9fb1735, + 0xeb4a879dc7fd35a1, + 0xe2d4ab3dc6de541f, + 0x49d7e83215f3627b, + 0x23ab56f543f581e7, + 0x2754dec761e89f45, + 0x8ef726365fda9eb1, + 0xdfbca54769bdac2f, + 0x69e3df1879d1ec8b, + 0xa1c85d3cb8c3eaf7, + 0x382a9dc1f9e81b75, + 0xe4ab91f327ea39d1, + 0x713658e326dc384f, + 0xad8f9ce653df46ab, + 0x184b79dba4e38629, + 0xd7c9e51cb1e6a495, + 0x8cba6f5a9ec8a4f1, + 0x1a6bc5ea9dcab26f, + 0x1ebd2841f89ec1db, + 0x54876b332ab1ef39, + 0xb84a6c9439c41fa5, + 0x2b15de9769c84e13, + 0x291eb7c765b93c7f, + 0x48d1e698739c4aeb, + 0x371548dba2cf6b59, + 0xd971fb3fe1d289c5, + 0xc2b1da8fefc6b943, + 0xe2d648321ea7b69f, + 0x264cfad43e9ac61d, + 0xe5cd8a943bade479, + 0x95b137498ab214e5, + 0x9d467c2cbac72463, + 0x1396f72dc6a742bf, + 0xb1c6ad8fe5ba613d, + 0xb563f1dfe2ac5f89, + 0xf6d3a2c2129e7df5, + 0xf8ab72e651b2ad73, + 0x4dc5b1943e749acf, + 0x3b964ac65e87ca4d, + 0x1ca26db65c6ae8b9, + 0x7f4658dcba8df927, + 0x7f41a98feab12893, + 0x971e684ed79436ef, + 0x3ae927d217a8456d, + 0xe94815a3238a64d9, + 0xf13db29762ad9347, + 0xcf8a51b8718f92b3, + 0x4b58de1baf95c231, + 0x2c1d67ea9c64bf7d, + 0xae96d78cba56cde9, + 0x695f1c7fe96afd57, + 0xb14a96d3297e1dc3, + 0x4ad7e1c76a925c41, + 0x26d98a1656734a9d, + 0xb85d693ba487691b, + 0x8b7e69adc25b6987, + 0x7f1c6e3cb16c97e3, + 0xdf47abedce5fb761, + 0x9c435a81fe62c4bd, + 0xdb9354e21d76e43b, + 0xb192da443c58f2a7, + 0xa81e24687b8c2315, + 0xf6b83c5a9a7e4281, + 0x2318a74a97614fcd, + 0xe789324dc5736e4b, + 0xf89ca56fe2456db7, + 0x869357a1f16a9c25, + 0x18f259b4325dab91, + 0x641feb332c3ea8fd, + 0x6d4e31865d42e86b, + 0x1e93bad98b34f6d7, + 0x7853149cbc6a1845, + 0x7be4652ed95c36b1, + 0x8594631dc86d452f, + 0x478cb6d1f751638b, + 0x4fc285b2165482f7, + 0xafc9b2d76348a175, + 0x915d73a762489fc1, + 0x43d197876e2bad3f, + 0x8457a3276a2fcd9b, + 0x49376bfbab43fc19, + 0x27cfba6feb361c85, + 0xd8a53471f9483ae1, + 0x324f85c2182b395f, + 0x15dca424362e47cb, + 0x1893bf5ba6418739, + 0x947a538cb42396a5, + 0x4e61b2adc248b613, + 0x1378de5bae19b37f, + 0xa461dfca9d1ac2eb, + 0x9fce61bedb2fe159, + 0xf3ac15276d3421c5, + 0x9c3eab176b174f23, + 0x23a879d659173d8f, + 0xfd346a9876194cfb, + 0x2f756bdba41e5c69, + 0x16d79f5dc4218ad5, + 0x95d2fc3fe214ba53, + 0x9ae728ddcde4b7af, + 0x268de9b21ef8c72d, + 0xe9d837c32cfbe589, + 0x48b1cd6439dce4f5, + 0xc18e564a9bf12573, + 0x172e53ba98e543cf, + 0x6a4289ccb7f8624d, + 0x1ec48b3ed4fa61b9, + 0x2f43ac9ed3ec8f17, + 0x7debac6212df9e83, + 0x6d1be92541e29bdf, + 0x7b1aec443fe4cb5d, + 0xafbce8654bd6eac9, + 0x13dc4af769dbfa37, + 0x1a6d2f4cb8de19a3, + 0xe491762edae35921, + 0x613275c1f8e3467d, + 0x79dc582214d765e9, + 0x65478ac323eb9457, + 0x5fb17a9762ed94c3, + 0xf13b576982dfb341, + 0x82d465f87fb3c19d, + 0xbe548f287ba4cef9, + 0xbd5e826dcab8fe67, + 0xa2563e81f8ba1ed3, + 0x5638fac329be3d51, + 0x7adf692437c14bad, + 0xd27abef657d46a2b, + 0x72c1f3b983d56a97, + 0x1becd38872ca98f3, + 0xe671283ba2cdb871, + 0x2a6835fa9e8fa5cd, + 0xed9218a1fda2e54b, + 0x285ce9a21da5f3b7, + 0x7fe9b8176dca1425, + 0x5bdcf7876abc4391, + 0x1dfeb837679c41fd, + 0x25f18c7a97a16f5b, + 0x62f1d38cb4a36ec7, + 0x7531a8bfe2b79d35, + 0xecd49761f2b89ca1, + 0xb4da8574328cba1f, + 0x163ab9f32e6fd97b, + 0x5d86bc254c92f8e7, + 0xad9416c98db71965, + 0x7314ed698ba937c1, + 0xa9b4715dc89b463f, + 0xfcb9681ed68e549b, + 0x5984c761f6b28419, + 0xa7b45fd216b4a285, + 0xad9164f65497a2e1, + 0x9e7a8f165178ae4f, + 0x65cd8eb54f59ceab, + 0x89d345687b6fed29, + 0x1d26fc9cbc831d95, + 0x637cf24eda863bf1, + 0xf84d751fe9783a6f, + 0x2fe348a2176a48db, + 0x4e75b1f3257e6849, + 0xd3eba5f7648197b5, + 0x8256c79ba495b723, + 0x6b83417ba176b48f, + 0x16d7ec5a9e58c3fb, + 0xd651493cbd5ce269, + 0x836e7dfdca6ef1d5, + 0x45e319632d964153, + 0x9a65cbf32a653e9f, + 0xe9c381b549685e1d, + 0x6c751239864b5d79, + 0x452c3a1a934d7be5, + 0xeb82759ed471ab63, + 0x162397bed153a8bf, + 0xb7a1695fef46c83d, + 0xd34e6a521f38e6a9, + 0x9c75e6443d4cf617, + 0x49c8df187c5f1683, + 0x63d24c198a6234df, + 0x48391a6cba47635d, + 0x2ae785bed74862c9, + 0x23157c8fe65c9137, + 0x5b83facfe24d8f93, + 0x9e415f3323419cef, + 0xdfbe8a965143bc6d, + 0xb8d31f654f25ebd9, + 0xf48aeb176d29fb47, + 0x2cfd75e98c4d1ab3, + 0x79421d8dcb5f4a31, + 0xf95bd21fea32478d, + 0x6cfb17dfe82456f9, + 0x3d4cae82182a9567, + 0xc9d86315462b95d3, + 0xf4723be9863eb451, + 0x13a52f998341c2ad, + 0x16cfa5da9f35e12b, + 0x8d32576bac15ef87, + 0x2f78196dcb291fe3, + 0xe569cd31fa2c3e61, + 0x1cfd48e3281f3cbd, + 0xd68c3a7659126c3b, + 0x472de81658146ba7, + 0x691782dcb6289a15, + 0x5e6b87dba42cb981, + 0x2b763e8a921ca6ed, + 0x5a628fea9cefd65b, + 0xb926e53edbe2f4c7, + 0x7698d5c32df81635, + 0xfc64d9b65cf934a1, + 0x1fa3ce9769eb531f, + 0xd31b749768fe517b, + 0xf471b25a95e16fd7, + 0x8473dcfcb6f39e45, + 0xfd64958dc3f69db1, + 0xbc965eaed1e8ab2f, + 0x583de6c321fcda8b, + 0x6b8341e32cbed9f7, + 0x3ebf5d176de31a75, + 0xc3941db87be638d1, + 0xfcd1a9398ad9374f, + 0x7b14da3a97ec45ab, + 0x94b1ae8dc6de7529, + 0x985cd411f6e1a395, + 0xc751db6326d5a3f1, + 0xe196a7f543d7b16f, + 0xcb791d3541d7afcb, + 0x4bc26d165fabde39, + 0x4587e9a76b9efda5, + 0x9efb3d7babc54d13, + 0xa1e724ced9c53b7f, + 0x32dc1791f6c749eb, + 0x8bd7ea3217dc6a59, + 0x7bd1f8c324be78c5, + 0x6a13dfc876d1b843, + 0xa3fe491872c3b59f, + 0x4ec3df7a92b7c51d, + 0x419cf7b98fbae379, + 0xcf41ed6bac9bf2e5, + 0x1a82c5bfecbf1263, + 0x1ba6c5932ca341bf, + 0x9ce7b42439a65f2d, + 0x4ce7269436b75e89, + 0xdba13497649a7cf5, + 0x12b6de4984ae9c73, + 0xfc2de41cb381a9cf, + 0x5c8f927fe1a3c94d, + 0x13efb65edf85e7b9, + 0x4c6bd7921e9af827, + 0x637b2a954ead1793, + 0x8de67a954a8d25ef, + 0xf5c9a1498ba2546d, + 0x68ae451cb8a563d9, + 0x561e39fed6ba9247, + 0xca64fb2fe58c91b3, + 0x89a4c5dfe48daf21, + 0xb9f3d5832381be7d, + 0xf1a68c254173dce9, + 0x96e2d4543e86fc57, + 0xc7d5e3176e791bc3, + 0x631475da9c8d3b41, + 0x3615ea2cba6f389d, + 0x75c84a3fea93681b, + 0x354a27c1f5a49687, + 0xbf7c4622157896e3, + 0xe5c97824348cb561, + 0x28de74f6526ea3bd, + 0xbf6e5caa9481e23b, + 0x5ca46efa9e64f1a7, + 0xfb671a3dce893215, + 0x375e491edc6a3f71, + 0xdb2c45a1f85a3ecd, + 0x93dae682196f5d4b, + 0xda6917e439526cb7, + 0xed9bfca548769b25, + 0x9b172c598457ba91, + 0x67f5a2398249a7fd, + 0x2d56791ba14ed76b, + 0xf6e95d2cbe41f5d7, + 0x3d1a68c1fe861745, + 0x3c1eb9a32e6835b1, + 0x1c4afe243c6a542f, + 0x98b73c576a4d528b, + 0xa9e5fdc9894e61f7, + 0x5ced914cb8429f65, + 0x9c372f1cb6459ec1, + 0xe95b427ed247ac3f, + 0x5a3d8e61f138dc9b, + 0x914da654324deb19, + 0xd3e1a7f76f421b85, + 0x528ecd187d4539e1, + 0x23c714fa9c27385f, + 0x6e57af398a2946cb, + 0xb794f6ddca2d7639, + 0x5684cb3ed72f84a5, + 0x92daec71f864b513, + 0x432e8a921635b27f, + 0x2786acd65437c1eb, + 0x3c21edf7612adf49, + 0x725cbef76d1cfeb5, + 0x9c53fd7bad514e23, + 0xf6c159bbab143c8f, + 0x429c53eed9164afb, + 0x7e8a1421f81a5b69, + 0x1a35c6e3281c79d5, + 0x1db25975471fa953, + 0xd4f1be887512b6af, + 0x1af3764a9415c62d, + 0xe7365facb217e489, + 0xac7f95698cd9e3f5, + 0xad8f25ecbcfd1473, + 0x6857ec3cb9de32cf, + 0xfe54ac932bf3614d, + 0x163ec8b328e45fa9, + 0xe6b29ca546f98e17, + 0x13b9fd7765fb9d83, + 0x78945a1763ec8adf, + 0xa6d254ea93f1ca5d, + 0x6a5ef24cb1f3e8c9, + 0x3e19b78dced6f937, + 0x9e3dac732feb18a3, + 0xce3a2b865ced4821, + 0xb17659e54acf357d, + 0x9a3db8f87ad264e9, + 0x3f78e6dcbae69357, + 0xdae2148cb6e892c3, + 0x8392f61ed6ecb241, + 0xd8c1495fe2bcaf8d, + 0xd5ec14f323b1cdf9, + 0x978fabc541c3fd67, + 0xe4f817965fb71cd3, + 0xae365c887eda3c51, + 0xa381954768bc39ad, + 0xd674be9ba8cf592b, + 0xd946f83fead26897, + 0xa2bd5c6fe6c597f3, + 0x3b76a48325d9b671, + 0xb4e6517323b9a4cd, + 0x5eb4831762aed34b, + 0x62e74ab983c1f2b7, + 0x7fb4918bafc71325, + 0x48a1f5dcbec84291, + 0xf18ec92cba983fed, + 0xc92de451f89c4e5b, + 0x43a72ec2189f5dc7, + 0xbda5187548b29c35, + 0xd5c2be9546c59ba1, + 0x1d3b5f7764a7b91f, + 0x23951df7629ad87b, + 0xbd1256eba19cd6e7, + 0xa64938bedfb21865, + 0xdb9ea3c1fea536c1, + 0x93dcfa221da8453f, + 0x64a3d8e32d8a539b, + 0x7bae9c165bad7319, + 0x47dbacf767af9185, + 0xf5d72ebba6839fd1, + 0x2c84167cb385ad4f, + 0x15793fafe276cdab, + 0x1b94d8c1f17aec29, + 0xe519ad83217dfb95, + 0x746de3165e823af1, + 0x427e1bc65d84396f, + 0xc319e2f65c8647db, + 0x71f842cbac8b6749, + 0x93fa127dc97d86b5, + 0x2b4e71aed78fa623, + 0xbcd7f31fe572b38f, + 0x7b8526321475c2fb, + 0x8a6f39c54378e169, + 0x63cf87e54169efc5, + 0xbef6c1998e7d1f43, + 0x715ed2998c613d9f, + 0xb68925cbab745c1d, + 0xf3a498dfeb465c79, + 0xb917da51f8497ae5, + 0xf7b98562185d9a63, + 0x9a45dec3254e97bf, + 0x56c124e98562c73d, + 0x67ce29598264e5a9, + 0x7de6a84cb269f517, + 0x8274e36cbf6c1583, + 0xfe95c17bab5c23df, + 0x7359a6b1fc71625d, + 0x4bce39832d5461c9, + 0xe1d9b5f43b468f27, + 0x69c718e6574a8e93, + 0xf39bd2e7653a8bef, + 0xf23eba69843fab6d, + 0x47fadc1cb342ead9, + 0x2ae9637ed135fa47, + 0xd3a7f51fef4819b3, + 0xa35148b32f5c4931, + 0xe85319d54c2e368d, + 0x24a9dcf87c3165f9, + 0x32176d5bac239467, + 0x16f4935cba2794d3, + 0xa21843fed84ab351, + 0xa7f6948fe53cb1ad, + 0xeaf8261ed43ecf1b, + 0x92cef6721432fe87, + 0x32ef6b9872461de3, + 0x3c92ab587f293d61, + 0x9d5afe876e193abd, + 0xf4a596798c1e5a3b, + 0x4531b8cedc2169a7, + 0x4783612feb24a915, + 0x95d74be1f926b781, + 0x59af48d32618a5ed, + 0x74dfeb94361cd45b, + 0xde854ba7641fe3c7, + 0x3425fd6cb7261435, + 0x7d1e653a9ef643a1, + 0x8b26f9dbace8521f, + 0x935b8d2dcae94f6b, + 0xba8129fdc8fb5ed7, + 0xb4c2fe9219ef8d45, + 0x95387dc547f39cb1, + 0xf1d8c6b546e5ba2f, + 0x427e6b1653f6d98b, + 0x2ae5f9d762ead8f7, + 0x42bc3e5ba1edf875, + 0x27f436ccbfe237d1, + 0x2c581d3fecd5364f, + 0xc3a2ef921de754ab, + 0xea75f4243ceb7429, + 0x96b235d54aed8295, + 0xcdfb839767ce92f1, + 0xbe31675986c2ae5f, + 0xa54d73f983d4aecb, + 0x3fc9178cb2c7ed39, + 0xd9cf513fe1d9fca5, + 0x9e74f13654de2c13, + 0x8c1b96754ec13a7f, + 0xd3e724165dc348eb, + 0xfce81bd54cd76859, + 0x4c739af769da87c5, + 0x9785edccb8cda743, + 0x5462bf9dc5bea49f, + 0xe614ba91f6b3c41d, + 0xd9e6fb4214c5e279, + 0x631bc5d543b8f1e5, + 0xe913657984dc2163, + 0x2cd46b965d8c2eaf, + 0x9c16a3298ca15e2d, + 0xb193c2dbacb35d89, + 0xc54e381ed9a67bf5, + 0x576a31d1f6ca9b73, + 0xa4ed3952157b98cf, + 0x8cfd43e3259fb84d, + 0xc7e1649654a2e6b9, + 0xec127aba93b5f627, + 0x69745a8cb2ca1693, + 0xaf234d1a9d8a24ef, + 0x47281a3cbc9e436d, + 0x5248ca61fca162d9, + 0x87d1ab432db59147, + 0x135ed9432b968fa3, + 0x7edc41b65789ae21, + 0x93bd42e6546bac7d, + 0xf48ebc58736fcbe9, + 0x17f4bd6dc392fb57, + 0xc473819fe2961ac3, + 0xa3d5c76fef893a41, + 0xea9c36521f6b379d, + 0x58bace143d8e571b, + 0x1fbed6554da19587, + 0x3d2ca4b87b8495e3, + 0x7dbe348dca98b461, + 0xeb4392adc568a2bd, + 0x6c5347afe57cd13b, + 0x8a92b63dc25edf97, + 0x14bde3f325841ef3, + 0xd7f6ac9652963e71, + 0x2cd739554f573bcd, + 0xb4d65c987e6a5c4b, + 0x14c629e98c4e5ab7, + 0xcabe478edc719a25, + 0x23f754afea64b891, + 0x3b79a21fe745a6fd, + 0x594f2c621749d56b, + 0x5d184b73235be4d7, + 0xbd7e6f29827ef345, + 0x635e84fba28534b1, + 0x9e5c4d3bae67532f, + 0x5128ef4dce49518b, + 0xa91b84fdcb3a5fe7, + 0x8dea3541fa3d8e65, + 0x1875d6b43a529dc1, + 0xbfa9e8d32854ab3f, + 0x26df9c154635da9b, + 0xbd1a6c287548ea19, + 0x14257bcba23cf985, + 0x176a398cb35f28e1, + 0xd7e82f9dce42375f, + 0x7ea845c1fe2645cb, + 0x743fdbc21e2a7539, + 0x95d8b6c54d2c83a5, + 0x3c864b587b5ea413, + 0x3954c6298942b17f, + 0x7a523bf98623afdb, + 0x91765e4cb526de49, + 0x623d81bdc328fdb5, + 0x13e94671f45c1d23, + 0x3e826af5413e2b8f, + 0x9cd36ab65e1249fb, + 0x23a159d87e145a69, + 0x43f59b776c1978d5, + 0xcd735b8a9b1ca853, + 0x5367efccb71d95af, + 0x67238a5fe831c52d, + 0x694ea7b1f614e389, + 0x8de4a5c43617e2f5, + 0xc49bfad9864b1273, + 0xcd5f9638742b31cf, + 0xe19f54a76bec4f3d, + 0xe8a92d587cf15ea9, + 0x253c4f1babf48d17, + 0xef1c2b8edaf69c83, + 0xae4d275dc5e789df, + 0x7b9362d216fcb95d, + 0xd63419e324efd7c9, + 0xf5c397b765e2f837, + 0x64ce27ba94f617a3, + 0xd185942cb3fa4721, + 0x52138cfa9feb347d, + 0x24d6f9bbabcd53e9, + 0x187d9341fce19257, + 0x149b75632be591c3, + 0x9c1ad8e549d7af31, + 0xc9da281435c7ae8d, + 0x743e1d9654dabcf9, + 0xd2a5be4983bfec67, + 0x914623bba5e41bd3, + 0x975e8faed2e73b51, + 0x1dc479afefc738ad, + 0x6fadebc21fdc582b, + 0xc31eba632dce5697, + 0x2ad4b8765bc196f3, + 0x3f417ed98ad4b571, + 0x3ba74cf987b6a3cd, + 0x8fe1b6dba6c9d24b, + 0xea52f74ed4ace1b7, + 0xb7da569dc3adef15, + 0xaefdc15325c43f81, + 0xe38d791541a53ced, + 0x4c5a17243fa84d5b, + 0x765def154e9a5bc7, + 0xb8acd3287cae8b35, + 0x3b2ae78ed8c2b9a1, + 0x27a638eed7a4b81f, + 0x5c437281f4a5d67b, + 0x2ae754c214a9d5e7, + 0xc9e846b323acf465, + 0xe3c8bfd874af25c1, + 0x7da3e1ca91b2543f, + 0x364f95198fa6529b, + 0x18da97bdceba7219, + 0x3fbc65eedc9b8f75, + 0xe3bcd671f97c8ed1, + 0xeaf84d532981ac4f, + 0x8ce567f32673dcab, + 0xe7b319554586eb29, + 0x21b8c4976378fa95, + 0xd27165eba48c29f1, + 0x37a6145cb19e286f, + 0x8dfb7e2dcf8246db, + 0xd2815471fea57649, + 0xfe95b8721e7984b5, + 0x9672c5d54d8ca523, + 0x3162b955496da28f, + 0xf5a148276872c1fb, + 0xfd537e6ba673df59, + 0xc318d47ba376fec5, + 0x4c21a97ed58a1e43, + 0xd4619c3fe16b2c9f, + 0x47258ba4327f4b1d, + 0x428c67f43f625b79, + 0x79fbc4143d6479e5, + 0x6d2ca8387d58a963, + 0x5a26b1f8784a96bf, + 0xcb43d17ba85eb63d, + 0x2976fb1ed761e4a9, + 0x47fd961fe685f417, + 0x648adef326791483, + 0xac9827d6546932df, + 0x3dca9549827c415d, + 0xdce73f576d3e4fb9, + 0x65bd481bad538e27, + 0x6d2c95acbc458d93, + 0x19e5d34dc9368aef, + 0x3c54e721f739ba6d, + 0xc5db7e92163ec8d9, + 0xa5e6b9443851f947, + 0xaec8763a976518b3, + 0xf26139acb5694831, + 0x64597c3cb14a358d, + 0x8cb9e4fbae2c54f9, + 0x97f62b8dcd2f8367, + 0x76a8c491fc5492d3, + 0xd8af64943d47b251, + 0x7da16ce43826af9d, + 0xaedf83c65739ce1b, + 0x598423f7652ced87, + 0xf6bd247ba7521ce3, + 0x7193ea8ed7453c61, + 0xfbc9283fe12639bd, + 0xda3b69ffef1a593b, + 0xb41375a32f1d58a7, + 0x3f82ebd54d2f9815, + 0xc3859bd87d23b681, + 0xc4d52f187915a4ed, + 0xe718253ba918d35b, + 0x437ae1ccb61ae2c7, + 0x64759bddc72df135, + 0x3eb8ad61f75342a1, + 0xd514a6f325143efd, + 0x48be6d2652174e6b, + 0xe5c6d4843ef85cd7, + 0xa2b359f76dfb8c45, + 0x954db12769fe8ab1, + 0xd4126efba8e1b92f, + 0xe934d87dc6f3d78b, + 0xa6e352ddc4e5d6f7, + 0x5723ec9214eaf675, + 0x2b89e51545fc26d1, + 0x6c358fd873de254f, + 0xea4d197981f253ab, + 0x5718d42bafe67329, + 0x6974defcbdea8195, + 0x89ac627cb9ca8fe1, + 0x54cd721fe7bc9d5f, + 0x4ec681f327e1adcb, + 0xae54cf3327d4ec39, + 0xacf218b434d6fba5, + 0x6f45c9a986ea2b13, + 0x163e9da983dc297f, + 0xd482a6ca91cf37eb, + 0x5ed4f83dcfd26759, + 0x2bd85711fed486c5, + 0xb74639821ed9a643, + 0xfd398e6328cba39f, + 0x362e91b658aeb31d, + 0xadcb358768c2e179, + 0x1da2345986a3efd5, + 0x9283c75cb6c81f53, + 0xa2b9147dc3b82daf, + 0x2953be41f1ab4c2d, + 0xdc74a5f321bf4c89, + 0x1c8ebfd43eb27af5, + 0xf817dac54ec59a73, + 0xbe5afd754ba697cf, + 0x12e834d7689ab74d, + 0x16db847ba68ed5b9, + 0x41f976ced8b1f527, + 0x6d3784e1f7c61593, + 0x436e5c8215a723ef, + 0x6e8af74653ba426d, + 0xfe9d8cb762ac51d9, + 0xb461fdc65d9e6f37, + 0x9c8e36287d928ea3, + 0x63182cdcbc96ad21, + 0xc726b8ffe986ab7d, + 0x3c59b211f568cae9, + 0xb74f8c62168dea57, + 0x9b623c4657a219c3, + 0x9375da4987b63941, + 0xe91cdf2982a7369d, + 0x94576eadc29a561b, + 0x49a8dcfcbf9d6487, + 0x5364219cbc7f84e3, + 0x3169ac71fd94b361, + 0x6fa3bde32c75a1bd, + 0xc2fa9e543967cf2b, + 0x7d9fcb14365ade97, + 0x19b8f468756becf3, + 0xa7d586fcb6923d71, + 0xe59134acb2743acd, + 0x2358fc7fe1875a4b, + 0xd214fabfef4a59b7, + 0x2b637fa21f6d8925, + 0x926e14f43d5fa791, + 0x5c7963254b62a5fd, + 0x2153dbc98a75d46b, + 0x729814cba958e3d7, + 0x9a45e1bdc87bf245, + 0xea75196ed67e23b1, + 0xa95df71fe683512f, + 0xdfe6a5c212634f7b, + 0x918c2a7431465de7, + 0x31f625b54f3a8d65, + 0xd4751af76e4d8bc1, + 0xcba928187b4e9a3f, + 0x2d963e1dca42d89b, + 0x9542f3beda45e819, + 0x721d893fe639f785, + 0xaf59b744385b27e1, + 0x5246ef74374d265f, + 0x9672d419836154cb, + 0x24c9de7cb1657439, + 0xf9ce153cbf3782a5, + 0x74f1ba9dce5ba213, + 0xd5ab6fedca2b9e6f, + 0x1bd5e78dc72f9edb, + 0x9e6bfa321a32ed49, + 0xd8baf2743824fcb5, + 0x98cb413878591c23, + 0x1c453f88753b2a8f, + 0x34e75bda942d38fb, + 0xc72f3b8ed2315869, + 0x4f85e72dcf1387d5, + 0x512eba71fe18a753, + 0x37641c932d1894af, + 0xf6438e965a1cb42d, + 0x483fb6e65a1fd289, + 0x47c562398923e1f5, + 0xea516d2dca482173, + 0x925d7f4ba5172ebf, + 0x3586b1ddc51a4e3d, + 0xd9183b41f21e4da9, + 0x2bd79ef654328c17, + 0x3ad871554ef29b83, + 0xdcab41743be498df, + 0x8f3126e54af7b85d, + 0x8becd14657fad6c9, + 0x145c6deba8fde637, + 0x39fac75ed8f216a3, + 0x4b7f295fe8f74621, + 0x9efdb2a215f8437d, + 0xe5c1a87543fa52e9, + 0x2179f3d762fd8157, + 0xa318f7c65dce7fb3, + 0x5947a3698cd4ae31, + 0xfb28d45879e4ac8d, + 0x5c42817ba7d6cbf9, + 0x17a58e61f5daeb67, + 0xde2f369216bcf9d3, + 0x5cd97e4768e23a51, + 0xb15d483765e437ad, + 0x312f784a93e8572b, + 0x38dc4b6ba1eb6597, + 0xa8e46d3a9ebc85f3, + 0x45f8eadcbdcfa471, + 0x9ceadb81f9b3a2cd, + 0x5a46d1f32ac6d14b, + 0x4c8a79f328b6dfa7, + 0xfb5632c547bafe15, + 0x6fb985a876bd2e81, + 0x54de16a985a13bed, + 0xc1329edba2d34c5b, + 0x5f89a17fe1d65ac7, + 0x49ab12cfefcb8a35, + 0xf531e6b32fbd98a1, + 0xdba5c7f43c9ea71f, + 0xe8af72d54ca2d57b, + 0x42d7f81769a5d4e7, + 0x8735fb4ba8b9f365, + 0x591a74ced7ab24c1, + 0xb8513fedc6ad423f, + 0xd17946a1f4c2519b, + 0x4f62e3a212a35ef7, + 0x4ab8f9d431b68e75, + 0x8651a2e54f798cd1, + 0xe46cd9a65d7c9b4f, + 0xc7b963f6586fc9ab, + 0x92d6f7bdcb83ea29, + 0x526e4bfed7a4f895, + 0xcbd9624fe6a928f1, + 0x9d65a282159b276f, + 0xfdb7e183248e35db, + 0xfd9746b983b17549, + 0xd8cf463a91a483b5, + 0x78d149ecbf98a423, + 0xfce2683cbd69a18f, + 0x18e6a5fdc85a9feb, + 0x3e589aced86fce59, + 0x936cb5e21972fdc5, + 0xc94e37865a971d43, + 0xad87feb545672b9f, + 0x1cda2b79857b4a1d, + 0xaf98e65cb26e4a79, + 0xf97da61dc29178e5, + 0xf834e51edf74a863, + 0x3295f1dfed4695bf, + 0x58d9fc721e69b53d, + 0xacf41b832b5cd3a9, + 0xc69f31465a6fe317, + 0xec7f691bab951283, + 0x29d3458ba87631df, + 0x8ad1f3ccb5683f4d, + 0x6542739ed25a4eb9, + 0x38ae1d21f15e6d27, + 0xa1659fe542618c93, + 0x46abe7332d4389ef, + 0xd1cfe8654e35b96d, + 0x94ad1fb65b38c7d9, + 0x435b126a9a3ce847, + 0x187d2b3ba84ef6b3, + 0x12b8d43fea854731, + 0xe452c191f756348d, + 0xe2a87dc2164853f9, + 0xebc64a86534c8267, + 0x1adebf38725e81d3, + 0x3f7a56998e52af41, + 0x6e1bf4987c23ae9d, + 0x3edb267a9a36cd1b, + 0x9e2a4bfeda29ec87, + 0x1e6c825ed72bfae3, + 0x12bea954394f2b61, + 0xb7f23186574238bd, + 0x6fcb13da9726583b, + 0x54d1238cb32956a7, + 0xe1d57accb23c9715, + 0x47dac8ecbf2ea581, + 0x738e59ccbc21a3ed, + 0xaed83471fc14d25b, + 0x1894fe743b26e1c7, + 0x69ade1554a19ef25, + 0x5284bfd7683c2f91, + 0x8c46d958761e2cfd, + 0x2e3d41bba7124d6b, + 0x16ab23fdc3145bd7, + 0xda2f576fe2198b45, + 0x1762fc5edefa89b1, + 0xfd25e4921deca82f, + 0x4a5983e32aefc68b, + 0x6de97f154ae2d5f7, + 0x461cd3298ae6f475, + 0x91f672eba8f925d1, + 0x75b846dba7eb234f, + 0x5318e97dc5fe42ab, + 0xf396b1cfe5f37129, + 0x7c56fa8212e37f85, + 0xfe8db27542f68de1, + 0x5e687f943ed89c5f, + 0xe98d675548ed9acb, + 0x89f374c768cfdb39, + 0x52cde93cb8d2f9a5, + 0xa182c64ed9e72a13, + 0xdb15649fe5d9287f, + 0xda2f6ec215da36eb, + 0x7dc6fea323de4659, + 0xf8d496a873e184c5, + 0xc5f8b32a91e6a543, + 0xea84d5c87ec6a29f, + 0xd3ef74c98ec9b21d, + 0x235afc9ed8abcf69, + 0x71a32efcb79fced5, + 0xa6cd8bf32ac41e53, + 0x2154bdf437b52caf, + 0x384c1d7656c84b2d, + 0x924b831763dc4b89, + 0xe1347c6982bd69f5, + 0x631bae5dc2d1a973, + 0x54f3167cbea396cf, + 0x4c9e8a11fea7b64d, + 0xc5f249321ea8d4b9, + 0x2d841fc43bace427, + 0x984ab7c658aef293, + 0xa6f41e3878a432ef, + 0x9356e2fba8b7416d, + 0x54f8376cb3a74fc9, + 0xb71c3afed2ab6e37, + 0xd8e71241f19e7da3, + 0x4ed8b7f654b3ac21, + 0x471be8532f83ba7d, + 0xc7dbe1f43d75c8e9, + 0x857f19b54c8ae957, + 0x418b9237698bf7c3, + 0xf75d92adc9af2841, + 0x7f6a428fe7a2359d, + 0xa9e23411f4a7651b, + 0xc9ad85b214ba6387, + 0x8c931b46549b82e3, + 0x8bc35f98739ea261, + 0x39b28f765e619fad, + 0x1b7e62498d74ce2b, + 0x35219b4bab65ed97, + 0x7dfe643dc968ebf3, + 0x7835b611f98d2c71, + 0x4c92f852176f29cd, + 0x276495143782594b, + 0x3d157e87639458b7, + 0x765fe43cb37a9825, + 0x78ce543cb27ca691, + 0x9afb26c98e5c94fd, + 0x6d9b1e2dce71d36b, + 0xe1569c81fb64e2d7, + 0xec197f632c78f145, + 0xa4179e265c7a32b1, + 0x7dcfbe26586b3e1f, + 0x13fd4a79865f3e7b, + 0xc5e13b6ba4625ce7, + 0x568a472ed2748c65, + 0x85acd64fe2578ac1, + 0xf576a81ede4ba93f, + 0x635794b21f3ec79b, + 0x78cd61954d52e719, + 0x1ce2b6d87c43f685, + 0x8e345a1a9b5826e1, + 0x9572ac4cb96a245f, + 0x92bd76cba75d43cb, + 0x6bf1c53ed75f6239, + 0x9863adb1f46381a5, + 0xbd8a73c323458ef1, + 0x32689a5541379d6f, + 0x387f2a654f289cdb, + 0x2739eb876b2edc49, + 0x297ad4698c31fab5, + 0x62be54aedc561b23, + 0xb14ef89eda36298f, + 0xd58431bfe62937fb, + 0x4c27ad62182d4769, + 0x5ce96fd4342f76d5, + 0x356fba8a9742a653, + 0x14a5cb79812593af, + 0x64a23dea9f18b32d, + 0x2f489cbbae2bd189, + 0x532918bba91bcfe5, + 0x1245d38feb421f63, + 0xc5a2b96439142dbf, + 0x7f6ac32659174c3d, + 0xdb8ea3c656184ca9, + 0x76fae48a952d6b17, + 0x184e3accb41f7a83, + 0x1cf234ecb31297df, + 0xbf25841baef3b75d, + 0x65f9b73febf6d5c9, + 0xe45783621cfae537, + 0xdf1bc3e329ecf4a3, + 0x932f18687aef3521, + 0x14ace5d989f3427d, + 0xe79fbd6ba7f651e9, + 0x926a748cb3e96f47, + 0xebf2a54dc2fa7eb3, + 0x3f987eddc2fe9d31, + 0x6f2491a432f1ab8d, + 0xd85c3e432ed3caf9, + 0xa94bd7643cd5ea67, + 0x2becd8f65ac9f8d3, + 0x247a3bd98aed2951, + 0x4efd672a97cf26ad, + 0x71658feed8e3562b, + 0xa8c694b1f3e56497, + 0x3efd946215d984f3, + 0x378164d654eca371, + 0x1b36278652be91cd, + 0x34281cb76ea1cf3b, + 0x89ac4f276cb3dea7, + 0xf512d7aa9ab7fd15, + 0x2b51c94fe9ca2d81, + 0xc8469231f69b2aed, + 0x356a78e217cf3a5b, + 0xf986a15436d259c7, + 0xf5269d4874d68935, + 0xd3f8e41763d897a1, + 0x1962e7d982cba61f, + 0x1d2e3af98f9ec47b, + 0xdaf567ccbca1d3e7, + 0xfb4635afecb4f265, + 0xf16c29354db823c1, + 0x182f39d659ba413f, + 0x829cf6b5469c3f8b, + 0x51ab9437659e4df7, + 0x8efc376ba4b28d75, + 0x5a176fedc3a58bd1, + 0x674f3baed1b79a4f, + 0xf5c1d9bfef69c8ab, + 0xb7564f921f7ed829, + 0x728a4ed43da1f795, + 0xe354b8976ca527f1, + 0xbe21c4a87ba8256f, + 0xfde2714ba78934db, + 0x3147a29dc7ad6349, + 0xcef23baed49f72b5, + 0xd63abc21f6b5a123, + 0xc8e6ab7212849e7f, + 0x615efad431769deb, + 0x29c4f1d43f6acd59, + 0x5fd136c54a6debc5, + 0xe9b87cfbad921c43, + 0x3b4751ddcb742a9f, + 0x592ba64fea87491d, + 0x2de8ca41f56b4879, + 0x59fd6ec2148c67e5, + 0x6dc83a53248f9763, + 0x23487df7637294bf, + 0x2fd43a8a9186b43d, + 0xbe41a3798f57d2a9, + 0xe31985dbad6be217, + 0xe124cf3cba5cef73, + 0x1c92564ed9612ecf, + 0x7eb52af21a753e4d, + 0xdbc8134328564db9, + 0x7e6ad525485a6c27, + 0xb3fda519845d7b93, + 0x67ca143a924d78ef, + 0xd281795dc152b86d, + 0xf316594cbf34c6d9, + 0x743e9a51fd39e647, + 0xbd6a94f21d4af5b3, + 0xe837d1a65c7e2631, + 0x1265ea387b61438d, + 0x53cb97a98a6452f9, + 0xdb14a73dca498167, + 0x235d41acb5497fc3, + 0xeb5f641ed35c9e41, + 0xb84a932fe13f8c9d, + 0x9312db754253dc1b, + 0x8f59db643f24eb87, + 0xefc79ab65c27f9e3, + 0xdb391ec98d4c2a61, + 0xd62349a9893e27bd, + 0xb6a5791eda41573b, + 0x32164c5fe92365a7, + 0xbd683211f7389615, + 0xe1a64d53263ba481, + 0x61ed9fa6543b92ed, + 0xb2f41968723fc15b, + 0xfe3c41a76e12dfb7, + 0xb37c46fa9c16fe25, + 0xe1d7a8ccbc382e91, + 0x463a79edc8192bfd, + 0xc6a34851f81e3c6b, + 0x65784fe439215ad7, + 0x315bd97769138a45, + 0x4bcf3518752698b1, + 0x649bc5398419a72f, + 0x3da1c5ba921dc58b, + 0x2d3f59698bedc4f7, + 0x2c9e764cbce1f375, + 0x17b5362febf624d1, + 0x4cd692721be8324f, + 0xd5967c4438f941ab, + 0x1c358d6547ec5f19, + 0x3ed5968874df6e85, + 0x6fc5b8ea95f38ce1, + 0x9d3c815ba2e49b5f, + 0x521b439ed1f6a9cb, + 0x9b584efdcfebda39, + 0xd3b7a2521fcde8a5, + 0xc9412bf76de42913, + 0x4c6d89e65bd4267f, + 0xdeb437f769d735eb, + 0xc1bf6e8ba8eb6459, + 0xc7b35e9ba6ed73c5, + 0x43e8f1ddc6df9243, + 0x3126fd7fe4d3a19f, + 0x23b4ed8212c49efb, + 0xa46f7c5431d7ce69, + 0xde25a9743fa9ecd5, + 0x28acbe376badfc53, + 0xb124ae8879c12baf, + 0x5ce1a34cb9c54a2d, + 0xbca7f62fe7d64a89, + 0x42c78b1fe4ca68f5, + 0xb38a79d215cd9873, + 0x69b8eda323ae85cf, + 0xa96345f873c2b54d, + 0x5af481c871c5d3b9, + 0x7eba16398fb9e327, + 0x9dbc21e98dabf193, + 0x8956ec1cba9c21ef, + 0x74d98a6fe9a13f5d, + 0x29f863b218a34ec9, + 0x715a39e329b86d37, + 0x7c3851a545b97ca3, + 0xd91f28b875ad9b21, + 0xeaf7b187628fa97d, + 0xc64a8d3cb1a2c7e9, + 0x374df19dcfa4e857, + 0x72459acfed98f6c3, + 0xfd9cba443eac2741, + 0x9c7284543b8e249d, + 0xf8a9e1c87ca2641b, + 0xa7124e8a9ab46287, + 0x15694a7cb6a781e3, + 0x561892ddc48a9f51, + 0x79aef15dc26b8ead, + 0x159f732fe17fad2b, + 0xaf1476d43182ec97, + 0xdcb53a432d75eaf3, + 0x367b8c465e892b71, + 0x2c4fad365b6a28cd, + 0x45f7b2da9a7e384b, + 0xc85b1f6eda9156b7, + 0xa325f74fe8a49725, + 0xd7453621f487a591, + 0xbc82fa62146893fd, + 0x3caf1be5437dc26b, + 0x269b8d16526fc1d7, + 0xea2dc9198d72ef35, + 0x2c63415a9d762fa1, + 0x7e461cdbab683d1f, + 0xacd569ffe95a3d7b, + 0x289d4671f85d4be7, + 0x6a7db4332a718b65, + 0x824f6c94376489c1, + 0x46fc95887456a83f, + 0x6b89a5387248c69b, + 0x8e43f9cba25cd619, + 0xb3d87c9bad3fe485, + 0x49d6e71dcd7425e1, + 0xa1b4293fec67235f, + 0xba74d9521d5842cb, + 0x3ae159f54b5c6139, + 0xc987dfe5483d6f95, + 0x84adefba97528df1, + 0x1823b59ba5439c6f, + 0x6fa8d3edc2359adb, + 0x85c69adfe138db49, + 0x16ab25cedf2ce9b5, + 0xda48f7621d4ef923, + 0xb796ad465d43278f, + 0x4c5d62987c2536fb, + 0x475b1f998c2a4569, + 0xebd9745ba92b74d5, + 0x8b75931dc82e9453, + 0x572ea13ed64192af, + 0x12356b71f645b12d, + 0x35bda4921325cf79, + 0xba917c354128cde5, + 0x94c783265e1bfd63, + 0x4c82e1f76a2e1cbf, + 0xcf6813aa9c124b3d, + 0x5ce6984edc154ba9, + 0x4bd9a15feb296a17, + 0xae8d4621f61c7983, + 0x8fd37ae3251c86df, + 0xe6387fa54721b65d, + 0x6be598c87513d4c9, + 0x396fd4cba218e437, + 0x39f8eac87de8f2a3, + 0xfe2b943badfc3421, + 0xd6f73c1cbafe317d, + 0xda63875dc8e14fd9, + 0x57286d421af36e47, + 0xac94d8b328f67db3, + 0xd71239a656fa9c31, + 0xfa98d36653fc9a8d, + 0x2d871b4762deb8f9, + 0x4219857cb1f2e967, + 0x15627f8baec5f7d3, + 0x2ba71ed1fdea2851, + 0x67cde9321ceb25ad, + 0x2af8ed643ade452b, + 0x3b2ac4165be16397, + 0xb1d8f95879d582f3, + 0x3c49781cb6e8a271, + 0x45687bca93c78fbd, + 0x82e3b67a92dcae3b, + 0x14c79d5fe1bfcda7, + 0xec82761542d3fc15, + 0xfa7e26d54fd62c81, + 0x56e1b2754cb729ed, + 0x7b91ca876adc395b, + 0x12bfcda769be48c7, + 0xef4b8addcad19835, + 0x1af9453fe7d496a1, + 0xa925f7dfe4c7a51f, + 0x4c738df214d9c37b, + 0x9a7cbf1543abc2e7, + 0xea968d4872bfe165, + 0x9fe54d198fb532c1, + 0x6cf5b4798ca63e2f, + 0xc8f2ae5a9ca73e8b, + 0x9b2534fed89a4cf7, + 0x3cb18a71f8ae6c75, + 0xdb524ef437b28ad1, + 0xcf14b7e326b3a94f, + 0x817efdc54395c7ab, + 0x3c1857a763bad729, + 0x64fc795981ace695, + 0xd267e3aa9c8de5f1, + 0x8e29a37dcda3246f, + 0x8ad51621fc9643db, + 0xd4293f821dba6249, + 0x68cf24b43a9c71b5, + 0xf9decb76579d8f13, + 0xea7315c765819d7f, + 0x972bf4a984739ceb, + 0x972f83ecb286dc59, + 0xc1bf367ed178eac5, + 0xb2e91a5ede7cfa43, + 0x4a3c76b32d6e189f, + 0xfca763465e93481d, + 0x1eda74f43da54679, + 0xf1bc9a754b8976e5, + 0x172d49ecba8c9563, + 0xbe7938dba56d83bf, + 0x6cd32a5fe681b23d, + 0xc72b6ad1f374d1a9, + 0x4592ecf21276cef5, + 0xa1829e654169fe73, + 0x93facde54e5a1dcf, + 0xa5cf9e287b6f2c4d, + 0x4eab26398d624cb9, + 0xa975421edc856b27, + 0x2af14d3feb587a93, + 0xf8b4215ed54a87ef, + 0x8ad6e2b2154ea76d, + 0xab8172f43461c5d9, + 0xa3efcbda9283e547, + 0x743f5d8a9167f4b3, + 0x95d74efbaf7b2531, + 0x834e725bae5c328d, + 0xe4b62a5dcb5e41f9, + 0xd3c48a2feb426f57, + 0x4ba983221a457ec3, + 0x8edfc7643a589d41, + 0xc3159d25453a8b9d, + 0xbac5f348754eca1b, + 0xc6a4e2dcb341ea87, + 0x51a3829cb154f8e3, + 0x932568aedf482961, + 0x83dba271fe3926bd, + 0x837ce9b21e2d463b, + 0xd68c14f43c2f54a7, + 0x1d2b6e398c639415, + 0xe156d3fa9b46a381, + 0xf9e47bcba63791ed, + 0xe6a975fdc529af4b, + 0x5678bd1ba32dceb7, + 0xb4adf98fe341fd25, + 0xb7e23f4763452d91, + 0xde2173c54e162afd, + 0xdfae18965e193a6b, + 0x8fa912776b1c49d7, + 0x7198fecbab1f7945, + 0xa6b3e29eda2397b1, + 0x6593cabed815a62f, + 0xba45c191f517c48b, + 0x3f416ce3251ac3f7, + 0xf759a147641de275, + 0x426bac5a965423d1, + 0x5316e9d98de5314f, + 0x6124ce387ce53f9b, + 0xf2d5163babf85e19, + 0x47d961adc9fb6d85, + 0x1edbaf8dc6fd7be1, + 0xb73c89a327e19a5f, + 0x63bad4e325f3a8cb, + 0x14ce7d9654f6d839, + 0x7c2d145762f9e7a5, + 0x7d123a5a92ecf713, + 0xc86e54fa9dce157f, + 0xedf1463bacd234eb, + 0xc36758a1fce76359, + 0x5437de821be972c5, + 0xb34f2ea65aec9143, + 0xe952b76435bc7e8f, + 0x49378b5765c19dfb, + 0xc7be29f984e3cd69, + 0x68afe54a92c6ebd5, + 0x9fae172dc1d9fb53, + 0xb1428f6edebc19af, + 0x26bd83c21ebf392d, + 0x5d8bcf943ed24789, + 0x5dbfe8943bc467f5, + 0xb2fdc8165bda9673, + 0x836dbca876ba84cf, + 0x354be1fa96bea34d, + 0xbfdc243fe5c1d2b9, + 0x613b74a1f4c5e127, + 0x8d473a2212b6ef83, + 0xf7eb26a542a81edf, + 0x2e761df54f9b2e5d, + 0xc8af61265b8f3dc9, + 0x43c7befa9db26c37, + 0x1984a7ced9c57ba3, + 0xf9d425cfe7c89a21, + 0x3d54ba81f49ba87d, + 0x42695b82148db6e9, + 0x18d9fa5434b1e657, + 0xb35d2e1872a4f5c3, + 0x6215d83ba3c92641, + 0x5df4b2c87f8a239d, + 0x4f9e371bae9d531b, + 0x3bcef86edcaf5187, + 0xb2d438ffea927fd3, + 0x89cabe132ba69e51, + 0x8df76a5325768cad, + 0xf7b385c54579ac2b, + 0x3fd746e6536edb97, + 0xd9216efba481e9f3, + 0xca64be9ed3b52a71, + 0x1e27c6fcbf8627cd, + 0xd5a874c1fe8a374b, + 0x69cd83a21e8d45b7, + 0x9671f4a43c9f8625, + 0x5c84bad76c83a491, + 0x1fe23b47687592fd, + 0xfe25bd1ba578c16b, + 0x376d459ba359bfc7, + 0x231e47dcb27cde35, + 0x54c29b71f4832ea1, + 0x93e6b5f542853c1f, + 0x19a3f7832f563c7b, + 0x69284fe43d594ae7, + 0x54fa69298c4d7a65, + 0xb347d21a9a5f78c1, + 0xdf128eadc962a73f, + 0x76b42dcfe764c59b, + 0x136b45d1f468d519, + 0x7cfbda92146be385, + 0xfd829316546cf3e1, + 0xdf1846ba9481325f, + 0xac59edf98f6541cb, + 0x32479f8bad475f29, + 0xe187da2cbc3a6e95, + 0x21574f8ed94b7cf1, + 0xabe623fed73e8b6f, + 0xd2e359b21742a9db, + 0xd169bc532735da49, + 0xf182cba76437e8b5, + 0xa5264d8a945bf823, + 0x798f3c1ba24d168f, + 0x237c168bae4135fb, + 0x12a4f8bede235469, + 0x6cb217e1fc2873d5, + 0x684bc9a21d4b9253, + 0x3e9d25a5493c81af, + 0xfdc713a6573e9f1d, + 0x143e6d598632ce79, + 0x2e18a7fa9624dce5, + 0x315cf2acb428fc63, + 0x54a6378ed2391abf, + 0x8a724e3dcf1e2a3d, + 0xc27854a43f2148a9, + 0x87314ac65e246917, + 0xd32ec8b65d169783, + 0x2ea937176a1985df, + 0x81a7f2ba981ca45d, + 0xd539472ba61fb3c9, + 0x6413c75ed814e237, + 0x19a4c37fe526f1a3, + 0x4718ba57675a4321, + 0xbf43cd96531a2f6d, + 0xe7bd3a654cfb3ed9, + 0x3184e9a76bef5d47, + 0x6fbd2a598af27cb3, + 0x8f7e952dcaf69b31, + 0xa7e8f25dc5f6a98d, + 0x7e6c1afed4eab7f9, + 0x3c9a4fd214fed867, + 0xbf6235d545e1f6d3, + 0x5e6a3dfa94f62751, + 0x5cb96fd981f724ad, + 0x4a95c1798fea542b, + 0x842bdf7baced5297, + 0x456f97acbace71f3, + 0x763cb28fead39f61, + 0xd948be2217c48ebd, + 0xea734cd326e7ad3b, + 0x25b84a1434e9dca7, + 0xae6f94b874cdeb15, + 0xe5c3bf8ba5e32b81, + 0x48316fbba1c428ed, + 0xaed7354dcfd7385b, + 0x4ad5e181feda46c7, + 0x543a8d221ecd8735, + 0xce92a7543bcf85a1, + 0xc851e92769c3a41f, + 0xde9cb8a768d5c27b, + 0x325bfc4a95b8c1e7, + 0xb14e3f6a93badf45, + 0x6bcd742ba39cfeb1, + 0x687943dfe4b13d2f, + 0x9f86bd4321c43d8b, + 0x693517d32ea64bf7, + 0xe1cf56443eca6b75, + 0xd8324af65bac79d1, + 0x4eb9f31767ae984f, + 0xb352879ed792c6ab, + 0x49135b7fe7b5d629, + 0x7ac6e481f3b8e495, + 0xe5387a93259ae4f1, + 0xb9e4adc654ad136f, + 0xc1e8a9b873a142db, + 0x3c457bd98fb56149, + 0x2643a9798d976fa5, + 0x2961dafcbc9a8e13, + 0x9428abfed96b8c7f, + 0x354c1e6ed56f8aeb, + 0x2368e4d21782db59, + 0xb4d158c32684e9c5, + 0xa5cd2f8765a8f943, + 0x952143b7638b179f, + 0x452d689ba29e371d, + 0xd9fa167dcfa14579, + 0xf7d3468dcd9374e5, + 0x9e26d1b1fda89463, + 0xd8ce36421c6982bf, + 0x93fb2d15497ca13d, + 0x6e7c4bd4365ebf89, + 0xb39612f98672cdf5, + 0x6d8c9f1ba485fd73, + 0x8fb9613ba3671bcf, + 0x928dc17fe17a2b4d, + 0x6c2fe19edf5e3ab9, + 0x87e4acb43f816a27, + 0xa19368f32e647893, + 0x67af15e43b4586ef, + 0x59e42b187b49a56d, + 0x1d762f99875cb4d9, + 0xd92ef15cb86fd347, + 0x13b58e6ed674f2b3, + 0x27b415a1f6982431, + 0xfbc647932469318d, + 0x3f617b25415a3fe9, + 0xc7d3a9e76f3d4e57, + 0xdf37e2b98e517dc3, + 0x7dfce32bad659c41, + 0x621df98dcb358a9d, + 0x8731b92fe748c91b, + 0xacb9e351f53cd987, + 0x5384f962164fd7e3, + 0x643cdf1659742861, + 0x3b9e5719834625bd, + 0xc9163b4ba169453b, + 0x87a3bc4a9f2c53a7, + 0x87f6c34cbd4e8315, + 0x4f638d5fed53a281, + 0x63817d2fe9238fcd, + 0x4f8ab2321926ae4b, + 0x81c927b43628cdb7, + 0x93fa7b47673bec25, + 0xf9ad32e8753efb91, + 0x579d82fba54329fd, + 0xe2b8a75ed125396b, + 0x92a413edcf1948d7, + 0x1857c421fe1c7845, + 0x5f6e19443d2e86b1, + 0x53421bc76c31a52f, + 0xe3df8b476a14c38b, + 0xc192d6598916c2f7, + 0xf73d915cb82ae175, + 0x57b48fea952aefc1, + 0xc4817e2cb52d1e3f, + 0x7824d391f4123e9b, + 0x132d5e7543265d19, + 0x9356adc32ef76c85, + 0x3c61e5f54cf97ae1, + 0xf2b5e6754aec895f, + 0x6a2d984656ef97cb, + 0xa15e246cb8f2d739, + 0x68e193bdc7f4e6a5, + 0xf75b1e6ed5e9f613, + 0x3a46c1f325eb147f, + 0xd637be8654fd23eb, + 0x64a2937983f16259, + 0x6b419c298fe471c5, + 0x213eca5a9cd78f23, + 0xbd7c3e976ac97d8f, + 0xa71b5d8a96da8cfb, + 0x1b5d627fe5dfbc69, + 0xe8d9f37217c2ead5, + 0x946ef8d327d6fa53, + 0x4acb689654d718af, + 0xefb4839874eb382d, + 0x2e9576cba1de3689, + 0x8fb3e12baec176f5, + 0x21baed8dced49573, + 0x1c8b4f2feab683cf, + 0xa2673c521bc9a24d, + 0x69b5f21437adc1b9, + 0xecb8a32546aecf17, + 0xdcabe26876b2fe83, + 0xc6bfa5e984a51cdf, + 0x834f1c5ba3b82c5d, + 0x2dfb491fe1da3bc9, + 0x7feb3a9edfae5b37, + 0x5dc8f1332fc179a3, + 0xe3fb59c54ec5a921, + 0x59a7dc843cb5a67d, + 0xa95fec1547a8b5e9, + 0x3cae287a98acd457, + 0xc4fe572ba69fe4c3, + 0x958c3dbfe8c62541, + 0x745ce2d1f4b6329d, + 0xf2d5ba6434c9521b, + 0xb7512ea431ab4f67, + 0xfc687b254f8c6ed3, + 0x1f843a687ea29d51, + 0x38cf9ad76c738bad, + 0xa36b51ced986ca2b, + 0x63279c1fe568da97, + 0x9c5a3f7fe57bd8f3, + 0xa1fbe583259ef871, + 0x7a6d1e35459326cd, + 0xd42c1ea982a7364b, + 0xb1273fe981a954b7, + 0xb9d6238baf9c8425, + 0x89ce567cbd7e8391, + 0x6a54e1fdcb7291fd, + 0x192fd7afe973af5b, + 0xad6be9721965bec7, + 0xa8739dc32879ed35, + 0x58e9af65456bfca1, + 0x4ecd3179857e2b1f, + 0x52b68a1dc4823a7b, + 0x5764fbddc18549e7, + 0x73c21a5edf4a7965, + 0x57c8a6e1fe5b87c1, + 0xca9342e21c5d963f, + 0x1c72b9643d61c49b, + 0x94fb25c76b75d419, + 0x7e2dc83a9a67e285, + 0x2148b95ba769f2e1, + 0xd7896c4cb67c215f, + 0xba37d46dc35e2fab, + 0x23a98be1f1735e29, + 0x79d6a45321746d95, + 0xd4f965e43e487bf1, + 0xe5b831c54d3b8a6f, + 0x986b3fd65a3e98db, + 0xf63d1b9bab51d849, + 0x9e4b1d8dc943e7b5, + 0xe14c658ed958f723, + 0x1738f2dfe64a158f, + 0xcbf892d2165c24fb, + 0xbea2d1c8725f4369, + 0x1578e46a916372d5, + 0x14c5362baf479153, + 0x9a235b798c267e9f, + 0x1e6ba3498b3a9e1d, + 0x1792f4ddc82ebd79, + 0x15ea4d61f831dbe5, + 0xb6279e521924fb63, + 0xa7f1d835473619bf, + 0x63b41c98764a293d, + 0x7e4ac6f9842d37a9, + 0x8cd4fe9cb23f5817, + 0x97f28e4dcf129683, + 0xd85afe9cbc1584df, + 0x8e1c29b1fc18a35d, + 0x47f912e43d1ab2c9, + 0x7d4bcfa65a2ed137, + 0xec2498776821ef93, + 0xf5cb412987241def, + 0x57cbd82ba5172e6d, + 0xc452137cb4183cd9, + 0x4871a2ffe21d5c47, + 0xdf32a51dcdfe6ab3, + 0xf28ad1c54ef29a31, + 0x8a5ed3732cf3a78d, + 0xe46b95843ae5b6f9, + 0x169bdfe549fad567, + 0xa16e75d987fbe5d3, + 0x4bd2e81ba7def451, + 0x4b1893ddc6f423ad, + 0xf7d1836fe4f7532b, + 0xf9d147b323fa5197, + 0x8bc19f5541da6fe3, + 0x379f85654fcd8e61, + 0x4c3f87965ae18cbd, + 0x26fe5c1879e4ac3b, + 0x6f7b234a98e5dba7, + 0x81534dfdc7d9ea15, + 0xc1465f8fe5dcf981, + 0xc6534ef325bf17ed, + 0xe8592ad546e2375b, + 0xfde3157982e645c7, + 0x84fc23aa91ea8635, + 0x8c1f5a487fdc84a1, + 0x9a45bcd98cbd931f, + 0x45bc678fead2c17b, + 0x576b3fdfe8a3bfd7, + 0xf48a652219b7de45, + 0x5dc8e67436a8fdb1, + 0x38af426656ab1c2f, + 0xfa8d5e1764af2c8b, + 0x4e6dab7a93c24af7, + 0x7d36aefdc1d46a75, + 0x915dab7dcfb978d1, + 0x7b8693afedab974f, + 0xbc8a93221d8e95ab, + 0x6315a9854cb1d529, + 0x97e83cd76ab4e395, + 0x75cf8ba768a7e3f1, + 0x478cbfaa97ba126f, + 0x2c9b5dfba59c31db, + 0x82153e4dc2ae4f39, + 0x39a45861f1b26ea5, + 0xe1c6d9f542b68d13, + 0xf54eba632e968b7f, + 0xf769cd443d6a89eb, + 0xef6a9b554b7eca59, + 0x5f4ab2887a91e8c5, + 0xd65faebdc9a5f843, + 0xf1b4e39ed5a7169f, + 0x25c76d31f59a361d, + 0xe7c8a65215ad3479, + 0xa8976b25429f63e5, + 0x3fe6d42981b49263, + 0xfa7982b76e7581bf, + 0xf169e7b98c679f2d, + 0xe24931d87c5abe89, + 0xedc4562ba86dbcf5, + 0xfb654d8fe981fc73, + 0xb4d6f79328741acf, + 0xd7c29ef436872a4d, + 0x1682fe46546a38b9, + 0xb7f41e9ba38d5927, + 0x8d39e7acb18f6793, + 0xf9e5347bad6285ef, + 0x16f57aedce75a46d, + 0xe34b56c1fc57b3d9, + 0x87cab5d21c6bd247, + 0xde3cabf5496de1b3, + 0xe7d164c98b954231, + 0x1be6573a98642f7d, + 0x43b5cd8ba4563de9, + 0x4daef31dc26a4d57, + 0x4fd123bfe15d6bc3, + 0x397abceede5f8b41, + 0x6b9a52e21f42a89d, + 0x68ae91c43e45c81b, + 0xf38adc954c39d687, + 0x51bd9868794ad6e3, + 0x8237145ba94df561, + 0x2a14df6dc86124bd, + 0x1765bd9fe876543b, + 0x74c62381f34852a7, + 0xfab65124346b8215, + 0x43de6a76524c8f71, + 0xf2d975e54b2f7ecd, + 0xe8f21db87e32ad4b, + 0xf691a2d98a24dcb7, + 0x6ab7f13dca38eb25, + 0x1e95a37ed73bfa91, + 0x63a5f9dfe63c18fd, + 0x78d61f432941386b, + 0x3916ba26582346d7, + 0x132bedfba3298745, + 0xeb368a1a923a85b1, + 0x3e5c1f998e1c942f, + 0xcfd285aa9d1fa28b, + 0xe5f239cedb23c1f7, + 0x9b21ad6fea14df65, + 0x2c4f9be43927fec1, + 0x3eac69b6582a1d3f, + 0x37fa8c46561e2d9b, + 0xe74d19fba7325c19, + 0xb4fd628dc4136b85, + 0x7da9b83dc32679e1, + 0xa273f16cbde7985f, + 0x43d591ffedfa96cb, + 0xa493bce21bfec639, + 0x7b2f81d43bf1e4a5, + 0x452df3687ae6f513, + 0xad85f29769e8137f, + 0x4d925c3986f932eb, + 0x4f1239ccb6fd4159, + 0x9d241f7ba2de4fb5, + 0x21a95f3ed1f48e23, + 0xd1fe5ca321e47c8f, + 0x34ec7b932ed68afb, + 0x6ac7f5243deacb69, + 0x1e526c7548bec9d5, + 0x26ac3fd98ad1f953, + 0x7e3c9f2cb8d417af, + 0x4398d61dc6e8372d, + 0x1d94b8c1f4eb3589, + 0x5a92cbd213dc64f5, + 0x2a369cb652df8473, + 0xc58943d761d382cf, + 0xdeb864987fc6a14d, + 0xe8cd92b65dc6bfa9, + 0x6a2e9d1989bace17, + 0xda935e1cb7aced83, + 0xa4f2b86fe7a21bdf, + 0xc534df8218c42b5d, + 0x458fcd7325d63ac9, + 0xa9b8f24764db5a37, + 0xcbfa613872cd68a3, + 0xe6c458dba3cf9821, + 0xdf8eb47a9fb2a57d, + 0xfa3b846dcda5b4e9, + 0x731a8e51fcb9d357, + 0xba4932c21b9ae2c3, + 0xf63478e659adf241, + 0x91dab5e768b2319d, + 0x6cd39e8876a43ef9, + 0xb183f65ba3b84e67, + 0xd986214cb2a96cd3, + 0x1c5b894fe2ad8c51, + 0x4eda87fdce6f79ad, + 0x572bc3421f83c92b, + 0xe6793f832ea4d897, + 0x7126a3554b98d7f3, + 0x8f7d69165a9bf671, + 0xe541fada978e15cd, + 0x152e3b7ed8a1354b, + 0x16d8fb7fe6a453b7, + 0x859d7411f4b98325, + 0x5f1e647434ab8291, + 0x9671b8c4316a7fed, + 0x92c6b1443d6f9e5b, + 0x6e1924765e62bdc7, + 0x7cae6b5a9b86ec35, + 0x56d39b4dc967fba1, + 0x7a6b589ed87b2a1f, + 0x93a7b851f56e297b, + 0xea748533269148e7, + 0x6cde518324a37865, + 0x3c42f6e6539786c1, + 0xc4b53df9817a953f, + 0xd523aeb87f5da39b, + 0x826379ebad6fc319, + 0x37fa5ebedc73e185, + 0xbe45fd2dc965efd1, + 0x6a51ced32a681e4f, + 0x9e6b712437592eab, + 0x34c89fb6576e4d29, + 0x973cfd6ba4716c95, + 0xd5ca783cb3647af1, + 0x5b6419edc145896f, + 0x8b9e26adcf3897db, + 0xade62941fe3dc749, + 0x8d43f2c21c3fd6b5, + 0x7d8ce1465c74f623, + 0xe1fc38587b56148f, + 0x9f1c6428795823fb, + 0x95dfec2cb85c4269, + 0x5379dc2cb74e61d5, + 0x95cbe6aed5618f43, + 0x3b1f2cdfe1437d9f, + 0xbf85a6e432469c1d, + 0xd2fa7b943f28bc79, + 0x2a1db8f54d2bcae5, + 0xeb56d1f87b2fea63, + 0x8b3e7a1a9a4318bf, + 0x34f8b62dca46283d, + 0xa65b1c2fe72836a9, + 0x3b92a571f83c5617, + 0xd3457922162e7583, + 0x2a5bed87654183df, + 0x91d4fbc98134a25d, + 0x246ed3887f26b1c9, + 0xad65b7398d19cf27, + 0x239dacb98a1bde93, + 0x478c5b6a971cdbef, + 0xc9e67521f9132c6d, + 0xf358e1d328153bd9, + 0xaf146c2438195b47, + 0x83ce5618751c69b3, + 0x495731dba52e8931, + 0xc5fa346cb321a68d, + 0x63b219c98de2b5f9, + 0xac68f5dcbcf5d467, + 0x2f35d1edcaf8e4d3, + 0x8a1c69e32aebf351, + 0x6e932c7548fe12ad, + 0x42fa8db879f3512b, + 0x1a3d78ba96e34f87, + 0x6ef5371a94f76de3, + 0x5d847a9cb3fa8d61, + 0xdb6c4f5a91fc7abd, + 0x6f7b48edcedf9a3b, + 0x7a236bf21fe2d9a7, + 0x7d1a8ce43cd6e915, + 0x3e6b81a54bd9f781, + 0xfc72a48658ca16ed, + 0x1e4f583a98de265b, + 0x45c21e6cb8e154c7, + 0x421f8eaed7e68435, + 0xae5d2481f4e783a1, + 0xae6917f434da921f, + 0x158976f431dc9f6b, + 0x8fdb56a43c9faed7, + 0x2c58fde87cb2ed45, + 0x815694f879a5fcb1, + 0xd9c1864ba9c81b2f, + 0x57b8a6cfe6dc2a8b, + 0xd832169fe5bd39f7, + 0x83dcf91328d16975, + 0xb1d856e435c487d1, + 0xd47cf69652c7964f, + 0xe74d9f2761d894ab, + 0x6b9e54f87fadc429, + 0xc7eb4ad98cafd295, + 0x2346f1ddcba4e2f1, + 0x6d73bf5feab7216f, + 0xed92837218972fcb, + 0x41efd35327ab4e39, + 0x4bc85a74369e4da5, + 0x8e547a6a96b28c13, + 0x5e6a2c3a92b38a7f, + 0x8e16b92dc1a598eb, + 0xea2b64cedf7ac859, + 0xec6a7421fe8bd7c5, + 0x2bac78e21c9fe743, + 0x7d93e6f54ca3159f, + 0xf5c2b7176ba7351d, + 0x41d5f7a768ba4379, + 0xb3fe729ba79b62e5, + 0x8be3961dc5ae8163, + 0xe2af597dc3817eaf, + 0x39e2bc11f1849e2d, + 0xf4e3dab32175bd89, + 0x9d1e8c632e68cbf5, + 0x73d598e54d6ceb73, + 0x17eac6d5495de8cf, + 0xe3154fcbab83294d, + 0x742f531eda8537b9, + 0xc513629fe69a5827, + 0x98b6ca21f48c7693, + 0xe5fc67d2136c74ef, + 0x4187fb965481a36d, + 0x452fe7c76174b2d9, + 0xa7dc2b6a9f68d147, + 0x18fd3b687c58dfa3, + 0x21d74c8a9a6bfe21, + 0x4532798cb95f1e7d, + 0x2ae438d1f8623ce9, + 0x3ec9b5421a864c57, + 0xb3158ed327586ac3, + 0xce85f1a8756c8a41, + 0xcda53e77624e879d, + 0xd12be47ba362c71b, + 0xe5213dccbf43d587, + 0x27e8a64cbc47d5e3, + 0x7afd468fec5af461, + 0x719c63b32a5c13bd, + 0x17692a465a6f423b, + 0xb47a1e998b6351a7, + 0xc4823a1a98456ef3, + 0xf137a6ecb5498e71, + 0x2e9bdc6ba2397bcd, + 0x458f37aed13e9c4b, + 0xa8235f7fef31dab7, + 0x58dfc4a21f34ea25, + 0x162e39d54d36f891, + 0xdc3824965b3917fd, + 0x214bea398a3d276b, + 0x378e1c5ba92f35d7, + 0x27ec5f6eda328645, + 0x8b5c213fe73684b1, + 0x12f94dafe548932f, + 0xa57f8c13243ca18b, + 0xf278d655412cafe7, + 0x83e16da87f21de65, + 0x4dbe53887b24fdc1, + 0x83db25ea9b271c3f, + 0xe9bca57eda182c9b, + 0x18a6bf3fe82d4b19, + 0x9362547fe71f4a85, + 0xf21acb95492378e1, + 0x1c79abe43614975f, + 0xeda42877631795cb, + 0xf4c762e9821bc539, + 0x9be13ad87efcd3a5, + 0x7e6f43aa9bdfe413, + 0x8de251fdcbe4127f, + 0x39efb76ed9f631eb, + 0xd978efb21ae83f49, + 0x87f46b1327fa4eb5, + 0x89cbe3a656fe7d23, + 0x39e872f764e17b8f, + 0x91538bc872e389fb, + 0xfea85c7cb1f5ca69, + 0xe62cf31bafe9c8d5, + 0x9a5163b1fbdce853, + 0x3bca872219bde5af, + 0xc6f3ea765be4362d, + 0x9871e4665be63489, + 0x83fc9db878d963f5, + 0x15c9763ba6ec8273, + 0x68ae541a94bd71cf, + 0x24da839cb4c19f3d, + 0x13db8c71f1d3bea9, + 0xf1de298432e6cd17, + 0x64c871b32fb9ec83, + 0x6b2f51743b8ae9df, + 0xf59c32b769bf1a5d, + 0x9c4821f87ad238c9, + 0xe4b586ddcad65937, + 0xbcf1684fe5d967a3, + 0x4ab89261f5dc9721, + 0xb4d7236213be947d, + 0x39e1f4a654c1b3e9, + 0x9345dbc981c4d257, + 0xbfcd53e76fa7e1c3, + 0x3eb162887ca9ef31, + 0xeacf9d487a9b1f8d, + 0x1468ca2cb78e2df9, + 0xed826b91f9b24d67, + 0x3f69c52218a56bd3, + 0x678e4ac436c98b51, + 0x273eba55439b78ad, + 0x1ebc2987639ea82b, + 0xc71f4beba2b1d697, + 0x7134d9bbae94d6f3, + 0xea1b748dcda8f571, + 0x39a1e571fb8914cd, + 0xe5c2fa421c9d234b, + 0xe81579b43a9f42b7, + 0x8f6315487ab48125, + 0xca2fe1da96a57f81, + 0xb82d47aa93867ced, + 0x9f1d274dc27a9d5b, + 0x72e54f6ed16eabc7, + 0x4f86ca9edf81eb35, + 0x6de9fab32e74f9a1, + 0xe67213a54d87291f, + 0x81b3aec54d6a287b, + 0x1dca6f765a8c36e7, + 0x2d37149cba9f4765, + 0x581b4a6ed79385c1, + 0x49c2635ed586943f, + 0x4738a6c1f367a29b, + 0xb9c57244347bc219, + 0x275fbc44316dcf75, + 0x6724ecd65c62fed1, + 0xba3f4c198c751d4f, + 0xb34ea1698c562dab, + 0x7e9fba2edb6a4c29, + 0xf84d521fe86d4b95, + 0xcb6e9a5ed75e69f1, + 0x65f834221752986f, + 0x71b84f93235496db, + 0xaf21ebd87258c649, + 0x61ab53c9816ad4b5, + 0xfe28a53a9f6de523, + 0x58a71c2cbd62138f, + 0x4f2ec98edc6532fb, + 0x3e57ab21fc584169, + 0x9f34ce621a394fc5, + 0xecf8a133295c7e43, + 0xb7ca5df5453e6c9f, + 0xe27934d986539b1d, + 0x746f38dba234cb79, + 0xc69d8a1cb137c9e5, + 0x268bf1ddcf2be963, + 0x12ba7c8eda2ce6bf, + 0x9312b7e54e51273d, + 0x7c1adb476d2435a9, + 0x3e2b56198c396517, + 0xc1b37d5a9a2b7483, + 0xf265b14a963b72df, + 0x4ae671ccb63f915d, + 0xf6a7c81ed432afb9, + 0xd79be351f135ce27, + 0x18d573954127ed93, + 0x7de8fc243c18daef, + 0x7b8a92e65c2e1b6d, + 0xe938f4187c213ad9, + 0xed73c16cbc135a47, + 0x19e8cb5eda1768b3, + 0x92da516fe72b9831, + 0x394e17c1f41c958d, + 0x1d3c5af3251ea4f9, + 0x532db9498512d367, + 0xea3275f98416e2d3, + 0x4c69dfb87de8f251, + 0xf68d23a87cf921ad, + 0x6deca95989ec3f1b, + 0x7fac965cb9df3e87, + 0x31ab697ed8f26ce3, + 0x7a5cd43329f58c61, + 0xa8fc3eb324f679bd, + 0xcd4193a654fca93b, + 0xcd82796652fec8a7, + 0xec13476ba3f2e815, + 0x591ef8bbaed4f681, + 0xc69517bbabc715ed, + 0x15c74d81fcea245b, + 0xe586c7d21aed43c7, + 0x51c62bf54adf7235, + 0x4ef2a37769e482a1, + 0xca81574765b47efd, + 0x63fca97983d79e6b, + 0x5b36972982e9acd7, + 0xb5e83cfba1bedc45, + 0xaf453beedec2fab1, + 0xfc91e6743ec51a2f, + 0xc9e124543ed6298b, + 0x3dac7ef54bca38f7, + 0x7fc4d2b76acd4875, + 0xec3f482a98bf76d1, + 0x37c8426cb7c2954f, + 0x1d7bc24fe4d593ab, + 0xe4cb21d1f4d8c329, + 0x3945cfe323cbd195, + 0x82a5fe75429bcfe1, + 0xad8521776da21e5f, + 0xe9fb2d476d942ecb, + 0x1c4357e98cb74d39, + 0x54987c1ed8b94ca5, + 0xc519b6dfe8ad7b13, + 0x523cfbeed4ae697f, + 0xca34765215a297eb, + 0xa46c7fb323b4c759, + 0xf83abe1542a8d6c5, + 0xda4f6c5981abe643, + 0x9b8d45c76d7ce39f, + 0xd894e3ccbea2341d, + 0x591cd74fedb54279, + 0x98c371b1fba861e5, + 0x25c9e7421b9a7f53, + 0xf4c98b73257b6daf, + 0x653b2ed5457f8c2d, + 0xc8a79d276472bc89, + 0x38f6d5aa9284caf5, + 0x25fe348dc198ea73, + 0xf45239dbad59e7cf, + 0xa389ec21fc7e184d, + 0x58a7feb32e8136b9, + 0xcbe598143da45627, + 0x1d26c7554ca87593, + 0x38bc19e6586973ef, + 0xb3c41f9ba57c926d, + 0x9418c3dcb46fa1d9, + 0x98e146ced482cf37, + 0xba587d31f175dea3, + 0x52fa3ec54378fd21, + 0xdbc8f9e43f5a1c7d, + 0x78c6f2354c5d2be9, + 0xba6ef42a9d814b57, + 0x89625d3bab7469c3, + 0xb815a26edb678941, + 0xa56cf37fe54a869d, + 0x148c7db1f45da61b, + 0x9c623ae2135fc487, + 0xc32b9d176572d4e3, + 0xbea8526a9287f361, + 0x9f168e287f5812bd, + 0x5a27ecfa9e6c413b, + 0x861fe29bab4d3f97, + 0x83e7fbddca516df3, + 0x379d5c11fa548d71, + 0xc936bd7218357acd, + 0xd9bf13a326389a4b, + 0x3e9c76d6543dc9b7, + 0x47f1d259834fd925, + 0xc1e589acb253f791, + 0xf84d725bae3516fd, + 0xa947ef6ede39256b, + 0x23e41571fc2b34d7, + 0xf564db921c2e7345, + 0x2839bed76c5283b1, + 0x3fc651d87a45912f, + 0xc49aefb986259f7b, + 0x65e3214a9428ade7, + 0x746d392ba32bcd65, + 0xc5bd681ba23febc1, + 0xf721456ede241b3f, + 0x741d9ea43f152a9b, + 0x697b4f365e284a19, + 0x71b3df876d1c4985, + 0xfe91b3698a2d67e1, + 0x1a6354fcba21965f, + 0x19b45e6ed71394cb, + 0x187ca35fe617c439, + 0xc2985d71f419d2a5, + 0xa64d1e36564ce213, + 0xf63182b5421cde6f, + 0x2bf7dc965ce12fdb, + 0xf431ed587cf53e49, + 0x24d3e7a98af74db5, + 0xe738ac2cb9fa7c23, + 0xc29a6e7cb5ec6a8f, + 0xbdf5367dc4de78fb, + 0x5fa736b215f2c869, + 0x5bfca87323f4c7d5, + 0x452db38762f9e753, + 0xda48bf5761d9e4af, + 0x4fac31d98fce152d, + 0xefcd945cbde14389, + 0x19f4b28dcbd462f5, + 0xc731b581fbe98173, + 0xdab4257217c86ebf, + 0x6f95843326cb8e3d, + 0xa5efc24434cf8da9, + 0x9cb51e2985e3dc17, + 0xb3f87cda92d5eb83, + 0x74de853a91b6e8df, + 0x7ec46f8bafcb195d, + 0xd679e8a1fdbe27c9, + 0x8d5e6bf32ed15837, + 0x95b634732cd476a3, + 0xedf219365bd89621, + 0x6279fcb656ca937d, + 0xab3e49c875bca2e9, + 0x45c178bba4bfc157, + 0xd84b672dc4a2dfb3, + 0x8253794ed2b6fe31, + 0x718d2af432b71e8d, + 0x6f458e943e8a2cf9, + 0xc78f26954dae3c67, + 0x94afdeb87cb16ad3, + 0x43c6fd5a9bc48a51, + 0x1a57f24dc6b587ad, + 0x582491cfe5c9a72b, + 0xe98ca361f3adc597, + 0xa6f78bd2149ec5f3, + 0xfd7a245765b3f471, + 0x93d821f872a613cd, + 0x958e62a87fa9324b, + 0x45f372698e9c41b7, + 0x8e7931fbab9d6f15, + 0x5f2eb3cedba27e81, + 0xb4629c71f6837bed, + 0x485c6ae217869c5b, + 0xf81d3ec32468bac7, + 0x27bdcf97648cda35, + 0x789d31e7637fe8a1, + 0x6d5347acb3a4281f, + 0xbf6d387dcf95267b, + 0x3189ae4dcd8935e7, + 0x1b87e421fd9c7465, + 0xc91e38432b8e74c1, + 0xbdf621e65b81923f, + 0x7c3d98f65874a19b, + 0x24b7a9598465aef7, + 0x8c6f4edba369ce75, + 0x521b3c8a936aecd1, + 0xb9e1f5cba16deb4f, + 0x867f42cfef632cab, + 0x8f43a5d21f764b29, + 0x145cea632e684a95, + 0xbcf179e54c5b68f1, + 0x86fad2965a4d876f, + 0xe425f9bba86195db, + 0xc97f458ed873c549, + 0xd5ca84bfe467d3b5, + 0x79a3c811f57ae423, + 0x7b31c4a3235be18f, + 0x64ba9df6536e21fb, + 0x8f9c4de87e623f59, + 0x5cbe6a998d364ec5, + 0xe894c35bac597d43, + 0x7839a41dc83a6b9f, + 0x51ab3e2dc74e8a1d, + 0x1938c641f641ca79, + 0x935c62d21743c8e5, + 0xf59b3a832547e863, + 0x3db97e176238e5bf, + 0x26ef145a925c163d, + 0x4fe512698e3f24a9, + 0x62b9348dce536417, + 0x5f2a7c6fed467283, + 0x4371fa9fea3871df, + 0xce82f432192a8f4d, + 0xcf9275d4362d8eb9, + 0x5df783276841cd27, + 0xda4329c98624ec93, + 0xab75e2198325d9ef, + 0xb3ef614dc2391a6d, + 0x261794ecbf1c28d9, + 0x91adfc3fed1f3947, + 0xa197b2e54e1267b3, + 0x19fdbe365d269731, + 0x827aed665b17948d, + 0xbf2ce957671ba3f9, + 0x65ce741ba81ec267, + 0x8a7c6d1cb742e1d3, + 0x81d7963dc625ef41, + 0x7f8c639fe3261f9d, + 0x289ad7c654293e1b, + 0x16aedf832efb3d87, + 0x58d123b54afd5be3, + 0xacdb1f987cf28b61, + 0xf95cb7a769f378bd, + 0xf39e41ddc7f6a83b, + 0x6f7c9b2ed4f9c6a7, + 0x12b5a6cfe4fcd715, + 0xd3ea958324dfe581, + 0x3b94da8765f314ed, + 0xd2a13e6981f7235b, + 0x15ceaf376fe942c7, + 0x6ce8b21a9dec7135, + 0x376ebf298acd6f91, + 0xb29d714ba8b17cfd, + 0x581d34b1f7e39d6b, + 0x6c75d48216e5abd7, + 0xc68df1b326e9db45, + 0xe861cf9654dce9b1, + 0xec45b92763bde82f, + 0xed46239ba1e3278b, + 0xdf13e8bbaec536f7, + 0x53ab8dedceda4675, + 0x5471ac61facb75d1, + 0xc4b382e21abd834f, + 0xa12b7e8548d192ab, + 0xd83ce74768d5c129, + 0x296d4a3874b6cf85, + 0x8394bf1874a8cde1, + 0xdc6a4919829aec5f, + 0x5cb936eba29f1dcb, + 0xbad5271fefb24c39, + 0x3b5c64a21fc64ba5, + 0x1c7d62e54ec97a13, + 0xdac9b2843cab687f, + 0x7a6f3e25479d86eb, + 0x45d1bceba8b1c659, + 0x246cda5cb7a3d4c5, + 0xc14b876ed6b8e543, + 0xa274e53ed3a8e29f, + 0xb2d15e7545ac231d, + 0xe3fa6b1652bf3179, + 0xbe7fd9c76e924fd5, + 0x7af6d4298da67e53, + 0x3bd4c9165b876caf, + 0x756fd42dc97a8b2d, + 0x6b84251ed56eab89, + 0x4bca753fe681c9f5, + 0x24ef95b216a4e973, + 0xf3c591b32385e6cf, + 0x79534187639a174d, + 0x3d61c2a8718d25b9, + 0xe762bc4bae9f4527, + 0x7d6b482dcea27493, + 0x3b62e7ddcb8572ef, + 0x281c6b51fb78916d, + 0x2c6573d2175a8fc9, + 0xa93b5f63286dbe37, + 0xde9c71f65671eda3, + 0x3f542d1a9685fc21, + 0x68c74fbba3861b7d, + 0x95d638edc1682ae9, + 0x12a589bdcf6d3a57, + 0xfdb15a7fed6f58c3, + 0xe38a5c932e739841, + 0x563efd932c64859d, + 0xbe8f5c254c68a51b, + 0xa27319d7695bc387, + 0xa824f71a976dc2e3, + 0xa93fd52dc783f261, + 0x46d52bafe47521bd, + 0xd2f4715fe1673f2b, + 0xcd54b7f3215a3e97, + 0xd4537b932e4b5cf3, + 0xc7b986465d4f6c71, + 0xbc9714276b4279cd, + 0x9f4176a98c35a94b, + 0xaf59428ed936c8b7, + 0x3ac5819fe74bd825, + 0x1beadc71f54de691, + 0x92c8fd44376215fd, + 0xbf563c798375246b, + 0xd35ec84a915843d7, + 0xde2871aa9f3b7245, + 0xf3e28d1a9e4d72b1, + 0x71b8c42a9a3d7e1f, + 0xc8ef64beda329e7b, + 0x1ac67d51f824ace7, + 0x275ad4921928dc65, + 0xb81e6c754639eac1, + 0xd47ce1a7652ce93f, + 0x96d2178ba541289b, + 0x537e18ddc2354819, + 0xb58ed16dcf194785, + 0xf752d41dcd2a76e1, + 0x648b7a9feb1c845f, + 0x15f7b8432a1f83cb, + 0x8db1ef376b14c239, + 0xc1fb82587926d1a5, + 0xf359b6d98627cef1, + 0x4a2d31998419ed6f, + 0x7a41f23a942c1edb, + 0x75a283cfe5213d49, + 0xe853f94edef24cb5, + 0xd72369c21ef67b23, + 0x1495eda32ce7698f, + 0x5c2b718439ea87fb, + 0xd831be7548feb769, + 0x6f1c8d5a98f1c6d5, + 0x4d53a96cb8f4e653, + 0x961a34ccb4d6e3af, + 0x267a3cdfe5fa142d, + 0x49786ec214fd3289, + 0x98cd2ba762de41f5, + 0x7aebd6365ed27f63, + 0x32f8a1b65ac46dbf, + 0xbefc84576ae78c3d, + 0x469f3eb876eb8ca9, + 0x2fc1b7dba6decb17, + 0x74ceb1d1f6d1ea83, + 0x4a857ed215b3e7df, + 0x6e19daf434e7185d, + 0x9ba3f8c653ea26c9, + 0x4c1357fa91ed4637, + 0x19ab7d698ecf65a3, + 0x32e176dcbed49521, + 0x2b86fa5febc5927d, + 0x17bd6951f8c7a1e9, + 0xe5c49a8218cabf47, + 0x1986fab3269dceb3, + 0xab9c2df767b2fd31, + 0x4ce9a23875b41c8d, + 0xa41537d983c62bf9, + 0x79218b5dc1da3b67, + 0x16f4893cbfac59d3, + 0x693facdfedbf7951, + 0x97c5fe321eb286ad, + 0x5e6f9ba43dc5a62b, + 0xfca419743ab8c497, + 0xb94f37e7679ac4f3, + 0x485de61a96ade371, + 0x3168dc4cb6a312cd, + 0x5c47f29fe5c6314b, + 0x239c48ffe1b63fa7, + 0xc26b149432ba6e15, + 0xf19a57443f9c6d81, + 0xb178d4243b7f6aed, + 0xb4aef2376d829a5b, + 0x7b913ef76a84b9c7, + 0xe168972dc7a8d935, + 0x1ce5ab7ed58be7a1, + 0xc387152ed48ce61f, + 0xd6e542b436a1257b, + 0x2ecfad1762a534e7, + 0x3e12fc4981b97365, + 0x39f87c476f8a73c1, + 0xb56847da9d7c813f, + 0xf456cbaa9a5e7f8b, + 0xde54781dc962adf7, + 0x9847cad1f984cd75, + 0xb6cda5332867ebd1, + 0x58c7fdb32569ea4f, + 0xca3b8616546e19ab, + 0x1dcf739cb5814a29, + 0x65dfeabdc1a34895, + 0xc254893cbe5867f1, + 0x7b18e6adcd4a856f, + 0x93746121fa5c84db, + 0xe2c584b21c6fb349, + 0xdf2a1b854a73d2b5, + 0xdb4a7f576a87e123, + 0xdc37ef298546de7f, + 0xdec6213984591feb, + 0xe2f3548cb36d2e59, + 0xab56134fe2714dc5, + 0x2a57f1cfef657c43, + 0xe76d3c921e356a9f, + 0xd8e54bf43e4a891d, + 0x185ca7354c3db879, + 0x8b3592a7693fb7e5, + 0x6291adecba52e763, + 0x4516d2cba735e4bf, + 0xa9c8456fe769153d, + 0x5eba1d61f45c23a9, + 0xe458a6b3246e5317, + 0xa4387e6a94627183, + 0xb8cae3965d236ecf, + 0x412a58c87c268e4d, + 0xc1fe28d76c278db9, + 0x6b2e4f1ba93dbc27, + 0x8e6d2a7dc72fdb93, + 0xa63285edc632d8ef, + 0x1a7ed5c32835196d, + 0x3657de15453827d9, + 0x5827ec4a952c3847, + 0x24ac8eda912e56b3, + 0xc385f29cbf429631, + 0xda215cecbe14938d, + 0x19527f3edc16a2f9, + 0xc61be841fb2ac167, + 0xed1538b3281abfc3, + 0x8713b2f6582fde41, + 0xf813ab4767231e9d, + 0xa721e8fa97263d1b, + 0x24ad165cb4193c87, + 0x67d432fdc21b5ae3, + 0x125dfa9cbefd7a61, + 0x3947d12dcaef67bd, + 0xfa6235b21df2a73b, + 0x859617f32bf4c5a7, + 0xe63a7d554af9d615, + 0x9753bd1767fbe481, + 0xd8a69fe875cbf2ed, + 0xf32de6adc7f1325b, + 0x2a19c75ed3f541c7, + 0x7c39b28ed1e86f25, + 0xeb49fd2432fa6e91, + 0x3a18cb532eca6bfd, + 0xc9d156243adf8c6b, + 0xc64b12d659e2bad7, + 0x29adc6f989e6da45, + 0x35e49bcba6d7e8b1, + 0x23e1974cb5cae72f, + 0x321645a1f4de168b, + 0xd3658e1326d135f7, + 0xc72e954982e36475, + 0x795cdf1762e874d1, + 0x537e92c76eca824f, + 0x3d5ea4976ecd81ab, + 0x28a6f41878beaf19, + 0x9a6274fed9b2ce85, + 0xd7c3aeb1f7a5dce1, + 0x52bcf49216a7eb5f, + 0x4b25e9f435d91acb, + 0x3f17459765ce2b39, + 0xf7d3ea4983d149a5, + 0x29ce863cb2d57913, + 0x41b8e75baeb5867f, + 0x3afe56bdcda985eb, + 0xc156db41fcadb459, + 0xb6c9d8a21a9fb3c5, + 0xdb15e7876ab5e243, + 0xb6d8731547a5e19f, + 0xa76b219987b9321d, + 0x643917a984ab2f69, + 0xfe854c3ba29c3ed5, + 0xa139bf2fe2b17d53, + 0x8a37cb5ede836baf, + 0xf32be5921f968a2d, + 0x745cd8b32e67ba89, + 0x81f695243a7cb8f5, + 0xa3ce1f665a9fd873, + 0xe41b5a2a9782e5cf, + 0xd12abe5dc8a7164d, + 0x2ab89c3fe5a824b9, + 0xc596b2d1f3ac5427, + 0xa4f5d9b214ae6293, + 0x8c9d6716539271ef, + 0xf5316d254e738f5d, + 0x91ad6e554d658ec9, + 0xfda954298c69bd37, + 0xd15bc4ea986bdca3, + 0x8e732d9dc87feb21, + 0xe5d81341f6831a7d, + 0x76f89a42167528e9, + 0x9e174dc3248a3957, + 0x8b492f37628b57c3, + 0x58e3627ba29e8741, + 0x2fb38dcbaf61849d, + 0xdb432aedce75a41b, + 0x784fc9bfed56c287, + 0xae57cd41fa69c1e3, + 0x83c596a3296bdf51, + 0x79d46b33264cfead, + 0x9acfd41768743e2b, + 0x789f61bba4653d97, + 0x5d29147ba2685bf3, + 0xafb27eced25c6b71, + 0x1d9538fbaf3e68cd, + 0x93d67541fe51a84b, + 0xbfc629521e43c6b7, + 0xc945d6b43c48d725, + 0x5bcf78a76b4ae591, + 0x8192d5c7674ae3fd, + 0x9f6ce21ba85f136b, + 0xb5e943adc86342d7, + 0x9cd5a21fe3687145, + 0x1a23bf8fe2486fa1, + 0x24c97fe4324a7d1f, + 0x27d81e443f2e8d7b, + 0x3f1cea465d31abe7, + 0x1ecd49298c23db65, + 0x41bd69298a36e9c1, + 0x8d6e419cb729e83f, + 0x542381ffe63d179b, + 0xa92fd63fe64f3719, + 0xa3ebf89219324685, + 0xd53a27e9843675e1, + 0xfe8943187129835f, + 0xb4ea2fd76f1a82cb, + 0x62e74c398d2eb139, + 0x5c78fd1bab21cf95, + 0x71cf543cb924cdf1, + 0x3e764abed815ec6f, + 0x8a5ec6f437281cdb, + 0x136847a6571d2c49, + 0x2a19edb8761f3ab5, + 0xc5d4638cb6147a23, + 0x7adef36cb214678f, + 0x4d1a2e5a9de586fb, + 0x59e1b87dcdfab569, + 0x54ac8f3fe9fcb4d5, + 0x879a6e421aefd453, + 0xead26cf548d3e2af, + 0xe49d35b769f7132d, + 0xaf21d64876fa3189, + 0xd457cfe984da3fe5, + 0xd7481feba2fd5e63, + 0xb931dc6ba2e16cbf, + 0x5af748edcfe48b3d, + 0xb35cfe421fe58ba9, + 0xb28591643de9ca17, + 0xd9581bf54aecd983, + 0x16ca7ed547aec6df, + 0x473ec8bba9e3175d, + 0xc64193fcb7e625c9, + 0x27e84f1ed6ea4537, + 0xa6279541f2ec64a3, + 0x18d2546435de8421, + 0xe9462d1653e2917d, + 0x3d9bf8154eb38fd9, + 0x81b37c965dc6be47, + 0x2a7d935769a8cdb3, + 0xb3712cda98abec31, + 0x236c4d7cb59efa8d, + 0xc3426d8fe6c32af9, + 0xa937e2f218d53a67, + 0x1f6ce79324c958d3, + 0x2a5b841763dc7851, + 0x2bdcf87761be75ad, + 0x4fabde798fc1a52b, + 0x2d38c4fbaeb4c397, + 0x462581eedba7c2f3, + 0xaed85b61f9bae271, + 0x5de97cb21679efbd, + 0x9c716d35479e1f3b, + 0xb41f97d656b23ea7, + 0x85e61bfa94b76d15, + 0x97fe365ba3b96c81, + 0x1cd7a96cb18a69ed, + 0x89b14fddcf7e895b, + 0xa62b5cd1fe91b8c7, + 0xcabe98721ea4d835, + 0x9d5e74243c97e6a1, + 0x837de6b54a89e51f, + 0x83cd4ef7689d147b, + 0xc67f281ba69f23e7, + 0x85fb1c7ed8b37265, + 0xf624519fe4a672c1, + 0xcab16efed1987e2f, + 0x8cd594f3216a7e8b, + 0x9d46ca132e5d9cf7, + 0xa3b8f2d54e81dc75, + 0x1ce357976b74ead1, + 0x362e5db98a76e94f, + 0x8c532b9ed76918ab, + 0xad568bffe67d3829, + 0x436a295fe48f3795, + 0xbd98fe53259376f1, + 0x41ae67f43295846f, + 0xaf4ce3d6516783db, + 0xc89635e87f6cb249, + 0x5e9c43d98d6ec1b5, + 0x718596ebab72df13, + 0xd1af459cb953ed7f, + 0x41c2ba71f8561deb, + 0x684a5eb2186a2d59, + 0xb8c96a73276d3bc5, + 0xedc41579857f6b43, + 0xbdc6f75ba352689f, + 0x72df8c6cb265981d, + 0x315e9d8dcf38b679, + 0xfe38a4ddcd3ab6e5, + 0x86e3da71fb4ed563, + 0x75d3fec32a51e3bf, + 0xc48adf265b76143d, + 0x14beafc76b5732a9, + 0x31ed594ba96b5217, + 0x26e9b53ba64c5f73, + 0x38dbe7aa923e5dcf, + 0x38f9214fe1528c4d, + 0x5bc2374fef248cb9, + 0x6ba53c221f38cb27, + 0x718beac54e2bda93, + 0xfc2a7585492bc7ef, + 0x2a473b5a9b42186d, + 0x9d2c348cba3426d9, + 0xc14753aeda293647, + 0x64afc83fe72a65b3, + 0x1936bd21f64d8531, + 0x654df9c2143f728d, + 0x2a9c3de76243a1f9, + 0x25db39476e14bf57, + 0x4df81b276d17bec3, + 0xeda942698b2aed41, + 0xdc271bf9871cfb9d, + 0x3ad5687fe9423c1b, + 0xce261781f9143b87, + 0x89cda1f3281759e3, + 0x13f82cd5452b7961, + 0x7ea39686531c76bd, + 0xce7a4b59821f963b, + 0xc429e6b98ef1c4a7, + 0x213bfd7bacf6d415, + 0x32b1e57dcbf7e381, + 0x167f932cb7c8f1ed, + 0xdc9a786439fd215b, + 0xd79eca8436de2fb7, + 0x8b613ac878f36e25, + 0xa736421984f56d91, + 0xd5b4691982e76afd, + 0x21aefb6a91fc8a6b, + 0xfe965b498fcea9d7, + 0x51496eb1fce1d945, + 0x7e5168f32cd4e7b1, + 0xcd7b61943ac7e62f, + 0x6579eb1549ea158b, + 0xa31be49768dc24f7, + 0x2ce894fba8df4375, + 0x8cea394cb6e473d1, + 0x5fb7e34dc3d6814f, + 0x56b8fc7fe1d67f9b, + 0x9de2874432dbae19, + 0x51f734c32faebd85, + 0xdf2be8365ca2dbe1, + 0xf7d4c89769b3ea5f, + 0x2583a4e878d619cb, + 0xfe87d49dc7db2a39, + 0x25fca86fe6cd38a5, + 0x62a9dc4fe5cf6813, + 0x2349d56214c2857f, + 0x895f612432c584eb, + 0x23bf8c7761d8b359, + 0xca3fd4876f9ab2c5, + 0xbce742398caed143, + 0x4afc89587a91de8f, + 0x9a17586dc8941efb, + 0x4ac16b51f8b72e69, + 0xbd89635217a93cd5, + 0x946adc8327ad6c53, + 0x9df351b5438e59af, + 0x854acdb874b3892d, + 0xe718c5bba1c4b789, + 0x34198edbae98b7f5, + 0x4e3ad98dce9bd673, + 0x3a9f742fe97bd4cf, + 0xf2d8b1643ca2154d, + 0xe59218f54ca523b9, + 0x439ed5f76ab95327, + 0x9d3612e987ab6193, + 0x6534f1e9837a5edf, + 0x639bf72ba28f7e5d, + 0xd1369a5fe1728dc9, + 0xc369f1dfef85bc37, + 0xbd86a5c21f67dba3, + 0x3d9e57b54d7bea21, + 0x45cdeab43a5cf87d, + 0x57a4e1876b8127e9, + 0x98b6ae5dcba43857, + 0x2685937ed79856c3, + 0x957fc21fe59b8641, + 0xb5729d11f26c739d, + 0xd7364b13247f931b, + 0x38c9ef165293c187, + 0xe69ab8354e65bfd3, + 0xb8f14d687c68de51, + 0x1f2358e76948fcad, + 0x8e394fdba96e1d2b, + 0xbdcf4a5fea613c97, + 0x452a96ffe8745af3, + 0x93547fc329586a71, + 0x971dbc43234967cd, + 0xcb2fea47625d974b, + 0x2df53769814fa5b7, + 0x435f92ebaf73d625, + 0xfe76a91cbd56e491, + 0x4a2ce63cba47e2fd, + 0xb5694d81fa5c126b, + 0x15836af32a5e31d7, + 0xefb986a54a716f35, + 0xfa38e61878546ea1, + 0xa173fd4a95467c1f, + 0x694f7c5ba2398c7b, + 0x42a1e7fcb13c9ae7, + 0x63ac421cbe2fca65, + 0x3164b7c1fd43e8c1, + 0x6db38ac21c25e73f, + 0xbfad79554d38169b, + 0xacd126b87b4c3619, + 0xd7a18b2a9a2e3485, + 0xc57498fcb95274e1, + 0x6a8e5b1dc734825f, + 0x4c26819fe43681cb, + 0x4531c62fe138af29, + 0xa2748e14312cbe95, + 0x785e91f54d2ebcf1, + 0x9fd13ba65c12eb6f, + 0x6a1f29887c251adb, + 0x15b9e8cbac182b49, + 0x357ba21ed81c39b5, + 0xae7964fed81e6923, + 0x8ad3f41fe521768f, + 0x46bcd353261385fb, + 0xd98fbe465317b469, + 0xf5ca9e187219b3d5, + 0x195f6db87efbd253, + 0xac7495e769ecd1af, + 0x9216e47babf4312d, + 0x4abd2efdcae42f79, + 0xae4b29fdc8f73de5, + 0xf27d5a3218fa5d63, + 0xf4e7396324ec5abf, + 0x1a6fd89654ef7a3d, + 0x897ef42763f2b8a9, + 0xfc168e3ba2f5c917, + 0x86729fcbafe9d783, + 0xbfc5d6498ab9c5df, + 0x651b783fe9bcf45d, + 0x892fcd543be124c9, + 0xe61a53432be65437, + 0x2e9834f659e862a3, + 0xb2ea465a97eb8321, + 0x1a264c3983cb7f6d, + 0x3471deb982bf7ed9, + 0x6d9fa21dc1e2bd47, + 0x173ac65fefa5dcb3, + 0xd86be3932fc8eb31, + 0x9c4e76d32cbaf98d, + 0x126ab7e54abd18f9, + 0xf73429198bd13967, + 0x13dc28bba9c457d3, + 0xdf3e685dc6d98751, + 0x71b23dafe3c974ad, + 0x8ca5e2d1f3cd942b, + 0xf8b2567213cfb297, + 0x81379fb762b4c1f3, + 0x5f9d3ea54ea5df61, + 0x86e19cf54a86febd, + 0x2634d5a87c9a1e3b, + 0xc261af7cb89e2da7, + 0x1275dacfe9b26c15, + 0xc64951b1f7c46b81, + 0xcfb5348214a568ed, + 0x69b34ec323ca985b, + 0xd97f6ca5429da6c7, + 0xc71a46b981afc735, + 0x79e31c498f93e5a1, + 0xe87b2d6bac96e41f, + 0x86917a2feda9137b, + 0x54b271d1fa9b32e7, + 0xab4d81932bae4165, + 0x9562c31548926fb1, + 0x19387ef656947d2f, + 0x4a95e3d763957d8b, + 0x92648e3ba2689bf7, + 0xc84fd51ba18dcb75, + 0x478fe1bbae6fc9d1, + 0x4298ce5edc72e84f, + 0xfbe8a9432e8517ab, + 0xa29563e54d8a3729, + 0xbaf685754b8c3695, + 0x815bcd68798d65f1, + 0xfd12c7ecb791836f, + 0xda5164edc57482db, + 0x257693afe387b149, + 0xf932c1afe168bfa5, + 0xfa5b8235427bce13, + 0xb459ac332b4edc7f, + 0x69ce37865d631ceb, + 0x9c5b17e98d762c59, + 0xd258c41a9b683ac5, + 0xf8257a9ed97c6a43, + 0x1afbd78dc64d579f, + 0x632bd9e1f562971d, + 0x9452f7b21463b579, + 0x5b2694d43267b4e5, + 0xbc2d5139817ad463, + 0xd2e3cfb76e4ad2bf, + 0x15e7af498b5ef13d, + 0x82dfa97dcd6431a9, + 0x2fa6754dca463ef5, + 0xc1239d61fa495e73, + 0x6a42c87217395bcf, + 0xef9863c3263e7b4d, + 0x3f8957e765418ab9, + 0x3bad458a9354ca27, + 0x9fc2567cb146d893, + 0x7a2c6d1a9d28c6ef, + 0x4f7b29dbac2bf56d, + 0xdb49fc7feb3f15d9, + 0x5c4837921d623547, + 0x826df4365c2764b3, + 0x9563d2f87b5a8431, + 0x85b216da963b718d, + 0x1d4b7f69842c7fe9, + 0x124f763dc431be57, + 0x8149d2bfe124bdc3, + 0xbe45182edf27ec41, + 0x3bd91a532e17fa9d, + 0xad82c1e65e3d2a1b, + 0xe9c376b65c1f2a87, + 0xc852e7fa9b1258e3, + 0x14bda62dcb257861, + 0x6d4e29bdc61875bd, + 0x46935fafe61c953b, + 0xba123c81f41eb3a7, + 0xc42379f76742d315, + 0x692bda187435e281, + 0xc6f1bd843ab4efcd, + 0xe5a3c7876ce81f4b, + 0xb13ed7f769fa2eb7, + 0x2b9143fba9fe4d25, + 0x2baf567ed8f26c91, + 0xfe162b9dc5e369fd, + 0xe379c48214f5896b, + 0xba1475f323f9a8d7, + 0xfc5138a762fdc845, + 0xe163d58872efd6b1, + 0x4e97a3f98dc3e52f, + 0xb358dcebade6148b, + 0x3f574dedcbd923f7, + 0x3b9a4261faec4275, + 0x68f42c9439ce62d1, + 0xc2dba35548c17e3f, + 0xedb2376545d37e9b, + 0xa3d1bf2874e6ad19, + 0x53e829b872e9bc85, + 0x4c179b3982dbcae1, + 0xb1ae73d98caed95f, + 0x8267dcb1fed318cb, + 0x6e2cb8d21ed62839, + 0xb1cae7432cd937a5, + 0x9febd1865adc6713, + 0xedca47b658bd647f, + 0xe483d6ca96c183eb, + 0xfb9513ddc6d4b259, + 0xbc53782fe3d7b1c5, + 0x7145ac6fe1b9cf23, + 0x98c571b3219acd8f, + 0x469e5cf32a7decfb, + 0x8bad91465eb32d69, + 0x6319b4f87ca63bd5, + 0xfe95dac98ac96b53, + 0x6b4d1afdc69b58af, + 0x24983e1dc5ae782d, + 0xdab192e1f4c1b689, + 0x89d3564214a3b6f5, + 0xfe5b291542b8d573, + 0x4c7de3b65198d3cf, + 0xb5e392c76e8bf24d, + 0x4facb2d87d8f12b9, + 0xfa43b15dcdb45127, + 0x4f36a25edba65f83, + 0x13df472fe6875cdf, + 0x7d56f3c2168a7c5d, + 0xd75f1c93246e7bc9, + 0x79a8c5176591cb37, + 0xf9c318687284d9a3, + 0x921f5d7cb3a7e921, + 0xd1feb38bae59f67d, + 0x7ae1538cbd7c16e9, + 0x7a4f59bfec9f2657, + 0x586b9ed21d9265c3, + 0xf5eb8ca43ca78541, + 0xc153bf254a68729d, + 0xf7d62e99867c921b, + 0xb576d48a935daf67, + 0xe83b426ba471bed3, + 0xbed56a4dc284ed51, + 0x73bf465dce45fbad, + 0xa2758c943f691c2b, + 0xf9b651743e5d2b97, + 0x81db3f465b6e49f3, + 0xe4cb532bac836971, + 0xf8d4691ba95476cd, + 0x7682ea9ed758964b, + 0xa9143c8fe35ca4b7, + 0xd6b47ce1f37ec425, + 0x9e3c5f854572e391, + 0x7ebd13965264e1fd, + 0xd2a4e5187f58216b, + 0xf8bc71276d492fc7, + 0x4f2d8a5a9b6c4e35, + 0xacd4517cb94f5da1, + 0xe5723f9ed9537b1f, + 0x286e7ab1f6348a7b, + 0x39cde7f21536a9e7, + 0xbf479313243bc965, + 0x532179c7634ed7c1, + 0x24bfed6a9251e63f, + 0xb3c4925baf34159b, + 0x3b6e941dce483519, + 0x71d3295fed2b4385, + 0x84271ce1fa4c63e1, + 0x34b8cf132a3e715f, + 0xcbf6931548327fab, + 0xe89573c76735ae29, + 0xe75a4df98427bd95, + 0xb6a521398439cbf1, + 0xb8251c4a912cda6f, + 0x7e4a39ddcf3219db, + 0x53c914a1fe152a49, + 0xb813f4a32e1738b5, + 0xdb84ecf65d1b6823, + 0x61b532854a1c658f, + 0x5714cbe7681e74fb, + 0x72a69d8dc812b369, + 0xedb1af3dc716b2d5, + 0x52ab184fe629d153, + 0x8a2bf7ced218ce9f, + 0x2fe3d8c5432bfe1d, + 0x9fe1d8743cdf1e79, + 0x2571e3f76bf23ce5, + 0x19fe6cb98bf75c63, + 0xfb18c7a768e759bf, + 0x39b81fdba6fb793d, + 0x2af8513dc4fe87a9, + 0xa84176cfe5f2c817, + 0xe38d2a6215f4d683, + 0x79642f5432e6c4df, + 0x8bd97c5761e9f35d, + 0xcadb14976fed13c9, + 0x51dae7ca9cdf4237, + 0xca5781dcbce461a3, + 0x9825cfeba8b45def, + 0x7235a6b1f5c87e6d, + 0xdfbe274215ea7cd9, + 0x3a6718c325deac47, + 0xa5ecf73765e1dab3, + 0xd6f1495984d5ea31, + 0xa816befa91c5f78d, + 0xe3cf97b98eca17f9, + 0xa619f53cbecd2867, + 0xb5c283dfeabf46d3, + 0x345afe632cd38651, + 0xb8d1ecf329c573ad, + 0x378c4ef657d8932b, + 0x72184ce765dcb197, + 0x9523fc48749cafe3, + 0xb86c5d7ba4b2de61, + 0x8f6e592ba193fcbd, + 0x13d46b5fefa71d3b, + 0x679a35f21fb92ca7, + 0xd4fc19e43ead4b15, + 0x963a7ce54cbf5a81, + 0xfb619d7659a267ed, + 0x8cd3e67ba8c4975b, + 0x1c9835aed4b8a5c7, + 0x9bc6f17fe4abc635, + 0x18e5c231f39ed4a1, + 0x53bce86545a2e31f, + 0x75fe2cd763c5127b, + 0x6adb93f65fa831e7, + 0xab925d687d9a3f45, + 0x6bc8ad987a8c5eb1, + 0xc9ebd45ba98e6c2f, + 0x684ad97fe6927c8b, + 0x8f4da93fe5849af7, + 0xafe38d921498ca75, + 0xfc4ae194347ac8d1, + 0xacdb8276528cd74f, + 0x79db64f9839216ab, + 0xd9528fecbfa53629, + 0xa1dbfe5dcea83495, + 0xf5e4c96edc8a64f1, + 0xcbf3578fea8c726f, + 0x78f643c3296f71db, + 0xbf9ae8554872af39, + 0x9da457b43674bea5, + 0x1a24bc7a9578cd13, + 0xcd463f998259db7f, + 0x96b23c49815cf9eb, + 0xc64179bedf712b59, + 0x5c6b3e21fe7439c5, + 0x643df9a21e786943, + 0x93e8adc32c4a569f, + 0xb7321cf54a5c861d, + 0x183ef5b7685fa479, + 0x29d6814ba872b3e5, + 0x4bd9a51dc587d263, + 0x3d47f68dc357d1bf, + 0x74ef932dc159ef2d, + 0x6d28ae44325d1f89, + 0x7ef6b3554e613df5, + 0xd36ea4c98e645d73, + 0x25b813c87b365acf, + 0x7b23a6f98b397a4d, + 0xa7fe821dc63d78b9, + 0x24f6ca9ed64fb927, + 0x56ac4b91f652d793, + 0xe936fcb21634c5ef, + 0x863ead965238f46d, + 0x341ab6d8725b14d9, + 0xe27fd5ba9f5e2347, + 0x68b4c17bae5162b3, + 0x1db3254dcd568231, + 0xeb287addca256f7d, + 0x3628dac1f6287de9, + 0x5634d2b2182cad57, + 0xcb712d55462fabc3, + 0xfe135dc98753eb41, + 0xc5da98b87324f89d, + 0x98e531bdc348291b, + 0x1a62ed3cbf1c2987, + 0x3af8724cbc1d47e3, + 0x814eb631fd328761, + 0x86b9c1432c1374bd, + 0xc7b189f65c17943b, + 0xf9cb13265819b2a7, + 0x45ade71a983dc215, + 0x463db81a952ecf71, + 0xb6c38e5a9412fecd, + 0x1658f7eed3261e4b, + 0xa28451ddcef62db7, + 0xedb625721efa4c25, + 0xe5941f643cfd5b91, + 0x768acbd439ce58fd, + 0x4e83f1d65af2986b, + 0x57a1b3fa98f4a6d7, + 0xf758319cb6f9c745, + 0x8b1da59dc4fad5b1, + 0x2d957a4cb3ecd42f, + 0xfb7513c545f2138b, + 0x53af412761e532f7, + 0x34fe17276fe94175, + 0xb327f1e76bd95fc1, + 0x28593cb879cb6d3f, + 0xd734b51987cf6d9b, + 0x8f74b61ed7e3ac19, + 0x7ec936b1f6e4cb85, + 0x3fea19d325d7c9e1, + 0x3ad71b6323cad85f, + 0x83b5dc2542adf6cb, + 0x8f761d4ba4e12739, + 0xc7ebd24a9fd436a5, + 0xe8f1a79cbed97613, + 0x41c9387edbca637f, + 0x14b582c1f8ac72eb, + 0x95fd47a328cfa159, + 0xc85ab24437c2afb5, + 0xbe6c824657b6ce23, + 0xc4a8e63653a6dc8f, + 0x37d92e876298eafb, + 0xcdb7821ba2be1c69, + 0xa149563dcfb13ad5, + 0xcd6a3571fec46a53, + 0x62cd4a721db657af, + 0x296ce7443cba872d, + 0xd1f7962437bda589, + 0x34952ac7679ea4f5, + 0xf592478ba8b2d473, + 0x9d1be65ba495d2cf, + 0x39a6428dc3a8f14d, + 0xbe85dc71f3ac21b9, + 0xa76d89e542ad3f17, + 0xe51afd954fa15e83, + 0xfb56a9354c835bdf, + 0xf23159854c967b5d, + 0x13aebf865b687ac9, + 0x9257bf8dc68dba37, + 0x9f648c3ed57fc8a3, + 0x1ba4c951f6a4e821, + 0xb38e76f21394f57d, + 0x5ca6d73543a815e9, + 0x62fe9a5981ac2457, + 0xefd943c87f8e54c3, + 0x13c2789cbea28341, + 0x329154fcbc84719d, + 0x586b4d9dca657ef9, + 0xb78d4211f859ae67, + 0x78364ab2176bacd3, + 0x8ce5f9d4367fdc51, + 0xa4738fe65462f9ad, + 0xef5c641a94861a2b, + 0x57db4f2dc1682a97, + 0xf281e53bae6b48f3, + 0x97fd568dcd6e5871, + 0xdb415ec1fb6175cd, + 0x2485fe321d73954b, + 0x47d1f9332c56a3b7, + 0x3ef57927697ac325, + 0x54372d99876cd291, + 0xc5b612a8734cbfed, + 0xa653db8dc4731f5b, + 0x96b8a21ed1652ec7, + 0x47d1a83fef694d35, + 0xb541d9732f4b5ca1, + 0x4b81d6e43c4d6a1f, + 0xbd2674165d41897b, + 0xa2e958476b43a8e7, + 0x475d829cba37c865, + 0xeac7192cb749d6c1, + 0x6f24b1edc64bd53f, + 0x4ae1cf6ed24ef39b, + 0x6a473f5326753419, + 0x415d378a91674285, + 0x9562f3b87f4962e1, + 0x31cbd8487c2a6e4f, + 0x2ead8948792d6eab, + 0xe8d42a6dcb41ad29, + 0x6fa71c9fe823bc95, + 0x5264bc1fe736caf1, + 0x75adcfb21528d96f, + 0xe61248b4342af7db, + 0x26ba89c8753f1849, + 0xc38d4e5ba14237b5, + 0x9154cd7cbf186723, + 0x5f2a471cbd19648f, + 0x274513bedc1a73fb, + 0xc43b6571fb1ea269, + 0x7dcbe8154a32b1d5, + 0x21da5f776915cf43, + 0xade5f1854615cd9f, + 0x3c8195f87528fc1d, + 0x6c439dbba42c1d79, + 0x42db3c7ba31f2be5, + 0xa27fd58dcef15b63, + 0xe598ab4edce358bf, + 0xb5f328c21cf6783d, + 0x784c9f632cfb86a9, + 0x921a68f549fdb617, + 0x52c7da8767efc583, + 0xf1bd529986e2c3df, + 0xd4c7f38ba4e6f25d, + 0xa6713f4ed4f812c9, + 0xa4f912dfe2fc4137, + 0x178cfe4321ed4f93, + 0xf9ebd1243db15cef, + 0xda7e93154be37c6d, + 0x3fc682754ae57bd9, + 0xd4ae537768e9ab47, + 0x421b36d986edc9b3, + 0xd9fe73ccb6cfd931, + 0xf918db5fe4c2f68d, + 0x3869de4324d516f9, + 0x96fd81e543ea2567, + 0xadb9285871eb45d3, + 0xfa4652198fce7451, + 0xacf591d98ec172ad, + 0x4d32be5bacd5912b, + 0x4b57f89ed9c5af87, + 0xca274d61f6b8ade3, + 0xb15cd68327abcd61, + 0xd931c5f3248feabd, + 0x531ba48876d41c3b, + 0x1bcda4e983d52ba7, + 0x4d739fecb2d94a15, + 0xf6432cbbafbc5981, + 0xbf4853cbab9c56ed, + 0xb92a8d31fdc1965b, + 0x9658b7a21db3a4c7, + 0x43698ef32ab8c435, + 0xde1a72f657b9d3a1, + 0xb89ce318769bd21f, + 0xd68915e8738def6b, + 0xd756a18cb4a32fd7, + 0x19b542fed1b73e45, + 0x59c1b2afef985db1, + 0x427f89b21e8a6b2f, + 0xa3fb74532d7e6a8b, + 0xa8fbecd54c81a9f7, + 0x49d1a8f76ba3c975, + 0x7f645c3ba896c7d1, + 0xf2e37d6cb589d64f, + 0x93ab1cfed37cf4ab, + 0xd91b27cfe4af1529, + 0x78ce9d5216b24395, + 0x4d7b182652a763f1, + 0x671893c54e89716f, + 0xea682c354d596fcb, + 0x936abd887b6d8e39, + 0x168db25dc971bda5, + 0x37cd814fe985dc13, + 0x6a94d28fe465da7f, + 0x5476b8e21457f8eb, + 0xd9641f24347d1a59, + 0xe5f92ac7637f28c5, + 0x425ca3dcb1a26843, + 0x83ed6f1bae74659f, + 0xef31a76cbe69851d, + 0xa2b59f4fed5ca379, + 0x46829c31f96da2e5, + 0x53ace1d54b82d163, + 0x1d5fc7a32753ceaf, + 0xab63d2e54756fe2d, + 0xa9cd4838745a1e89, + 0xce53ad2a936b2cf5, + 0x9c6f847cb16f4c73, + 0x5df1624cbe4259cf, + 0x3b81e9c1fe35794d, + 0xd654ab821e3687b9, + 0xbe87d5a43d4cb827, + 0xa473fe165a4ec693, + 0xd6efcb187851c4ef, + 0x943bfe1ba854f36d, + 0x2af8134dc65713d9, + 0x13f47c6fe56b3247, + 0x85ce1361f26d51b3, + 0x81cb2375435e6f21, + 0xd8c7b1f54f326e7d, + 0x47ebaf165d247ce9, + 0xb27f49e76d28ac57, + 0xe65c41f87829bac3, + 0xe4172afcb83eda41, + 0x3d84916dc631f79d, + 0x75c413a1f745281b, + 0x352bd96215392687, + 0x3f854ec8752a46e3, + 0xd26185fa923d7561, + 0xe4d58ac87e1f63bd, + 0xbef5243bae14923b, + 0x27db481dcd25b1a7, + 0xae3f287dc917aef3, + 0xe235a811f82ace71, + 0x81bf9d43261aebcd, + 0xa7b39e2768321d4b, + 0x39fca57986142cb7, + 0x6fd4918ba6184b25, + 0x71a5328dc32b5a91, + 0xebf6a4998cea57fd, + 0xed85b7fbacfe876b, + 0x6a9c523febf1a5d7, + 0x5c2a6e321bf3c645, + 0xe81b2a7439f7d4b1, + 0x84327fe657e9d32f, + 0xba5f793765ecf18b, + 0x1ca5487a95de21f7, + 0x248af79cb4e23f65, + 0xed63af5cb2f65ec1, + 0x751496fcbed86c3f, + 0xe8b273421fea6c9b, + 0xc482af943cde8b19, + 0x8d91bce54be1ca85, + 0xae95723769d4c8e1, + 0xa4ec538a98c6d75f, + 0x8623a7fa94d8f5cb, + 0x7bd863adc5ed1639, + 0xa4b3926fe3df24a5, + 0xcf936ae326e47513, + 0x6ad1e7c541d5627f, + 0x6583cde54fc871eb, + 0xa7d8cf665dcb8f49, + 0xb745831768ad9eb5, + 0x4529e38ba9b1cd23, + 0xb2561d8dc6a3db8f, + 0x589bf31ed4a5e9fb, + 0xcf5bad4325da1b69, + 0x4df8765434bc29d5, + 0xf8c4a53872cf4953, + 0x7d9ceb2981c256af, + 0x46d8ce2a9fb5862d, + 0x92a678fcbec7a489, + 0x437e812edc9ba3f5, + 0x7a2ce5d1f9aec273, + 0x9b8e5c443892d1cf, + 0x3ad17f432794ef3d, + 0x5ecf68a545b61fa9, + 0xd9b1c6f985ba3e17, + 0x4adf2eba92ac4d83, + 0x23e1a45a918e4adf, + 0x4f97b26dcf927a5d, + 0x674ae291fea478c9, + 0x456d72f21ea8b937, + 0xea5d46332d8bc7a3, + 0xb2614df65a9ed721, + 0x3d2974b76891f47d, + 0xa8fce41cb7a514e9, + 0x7e45bc8ed6b92357, + 0x8fb74c5fe49a52c3, + 0xb7246581f3ad7241, + 0x7b98ac53217e5f8d, + 0xd6f754843e627df9, + 0x46ecd7f43e84ad67, + 0xfbed68465c67abd3, + 0xfa945e29897adb51, + 0x61735daa965ce8ad, + 0x3c1b865fe783192b, + 0x25ae1891f5a42897, + 0xa7bd54f2159847f3, + 0xa2db8c35439b5671, + 0xfb8639e6517b64cd, + 0xa8b342f87e6f834b, + 0x61af82da9e63a2b7, + 0xf96e4c1cbd87c125, + 0x74ceb18eda57cf81, + 0xc2eb78d1f648bced, + 0x67345a82174cfd5b, + 0x8f75dba548612dc7, + 0x53f726da97864c35, + 0xaed5c43a93675ba1, + 0x52c6fe9cb25a691f, + 0xf8376ecbaf3d687b, + 0x354fce8cbc3f96e7, + 0xb2197ac1fd42c765, + 0x81dbc3732b46d5c1, + 0xc6f3e1732a58d43f, + 0xa46c92d6574af29b, + 0x581924fba86e2319, + 0xe943562dc9724185, + 0x691f753cb3645fd1, + 0x82751badc1376d4f, + 0xd9b5fa8fef286dab, + 0xabd27e521f3d8c29, + 0x8abe96d43d2fab95, + 0x42fb7a876b43c9f1, + 0x135d2af87a24d86f, + 0xbe6724da9827f6db, + 0x43caef2ed83c1749, + 0x6b19afeed73e26b5, + 0xcad83171f8517623, + 0x2cab35f21524638f, + 0xe1874da6513672fb, + 0xafde2c765f2ba169, + 0x7b14f9e76d1b9fc5, + 0x759e41398a1fbe43, + 0x5c9287bba812dc9f, + 0xbf1e49adc825fb1d, + 0x8749c5a1f6281c79, + 0xbaf149e4371b2ae5, + 0xcd12ab76571e4a63, + 0x6314fc99842157bf, + 0x7b289fcba214873d, + 0x8cd1be387ef485a9, + 0x15e7f23badf9b517, + 0x2a76efcedafbc483, + 0x8fe1b25ba7ecb2df, + 0xb7fc2d9439e2f15d, + 0x8ab1e36548f521c9, + 0x14bd23f656e83f27, + 0xad5b91f875fa4e93, + 0xe964bd3872da4bef, + 0x234adc1a91ef5b6d, + 0x9d82a5fcbfe27ad9, + 0x1c784de1fde5ba47, + 0x4839adf21de7c8b3, + 0x1f628ac54aebd831, + 0x4a5ec1d437bce58d, + 0xc2d6f19878d215f9, + 0x5634c2ecb9e52467, + 0xfa49c27cb6e854d3, + 0xb134ae8ed4eb7351, + 0xc8d79a51f2ec61ad, + 0x9176ef8432ce7f1b, + 0x28b156c43fc2ae87, + 0xb36572a54db5ace3, + 0xc4ed78265ab8dc61, + 0x1cfe7a3656a8e9bd, + 0x91b45f3986adf93b, + 0x32d58cffe6d129a7, + 0x85c23ad1f7d64915, + 0x8b7641d324d95781, + 0x2e6c98d432b965ed, + 0x85e12ac761cd845b, + 0xa18b93e65eaf93c7, + 0xfe1dc8ba9eb4c235, + 0x85b21f4a9cb6d2a1, + 0x25791cbba786befd, + 0xa871f92ed589fe6b, + 0xf9745ac3269c1ed7, + 0x32fead9768b13d45, + 0xb24f136876a45cb1, + 0xbf32ed4983b76a2f, + 0x5312b9c871ca698b, + 0x75394c1bae6c98f7, + 0x92367eddcd9fb875, + 0xc2986751fb93c6d1, + 0x9b43a8f21b96d54f, + 0x53ca47932987f3ab, + 0x1b3aec2768ac1429, + 0x6729baf987ae3295, + 0xd947352cb7a362f1, + 0x7a158fecb2936e5f, + 0xe359164ed1856ecb, + 0x63945d1fef6a8d39, + 0xae583d621f6d9ca5, + 0xf12b5d354d7fcb13, + 0x32e18c554b62d97f, + 0xe3fdcb465964f7eb, + 0x32ab574dcb7a1859, + 0x76843eaed68b27c5, + 0xa276ef5ed69e5743, + 0xf19a357fe381649f, + 0xe9586af32395841d, + 0x57fe91c54186a279, + 0xefd789354f69a1e5, + 0x5a481ce87d6cbf53, + 0x39bf28e7684ebdaf, + 0xd1c4f6bba963fc2d, + 0x5846ac1fea651d89, + 0x3da7518fe7682bf5, + 0xad4fe682186c4b73, + 0xcd3986b3235d48cf, + 0xebf6712a9361784d, + 0xdcf7865ba15386b9, + 0x39cb7e5baf48b627, + 0xa713d6ecbe4ac593, + 0x72635dedc94ab3ef, + 0xf5d684edc94fe26d, + 0x9dfe15a43b6412d9, + 0x87b341665b683147, + 0xe3d4975767584fa3, + 0x5fdab2ca975b6e21, + 0xf26b1d7a923e5c7d, + 0xad1658bdc2417be9, + 0x1b538c9edf23ab57, + 0x49b75321fe26b9c3, + 0x361cbe732e3ad941, + 0xb7a28dc43a2be69d, + 0xcf68a2b6593ef61b, + 0xc7bd589bab432587, + 0xf5462e8cb92745e3, + 0x2bf6458ed83a7461, + 0xa92c47dfe43a62bd, + 0x936457c1f24e813b, + 0x2ea835f54231af97, + 0x819b3d265e14adf3, + 0xf276a8365e26cd71, + 0xce987df65917eacd, + 0x64dfb8a8781cfa4b, + 0xf4e579bdc82f1ab7, + 0x3df4a76fe9134a25, + 0xa89b1431f7265891, + 0x95acd843241856fd, + 0x19ace3f5431c856b, + 0x4f53a9e7621e94d7, + 0xb2ae38187defb345, + 0xd56b72c98cf4d3b1, + 0x7fd342ea9ae6d12f, + 0xc52694eba8d6ef7b, + 0xe3254f9dc6da1fe7, + 0x7cb93e6218fd2e65, + 0x1be98a7547f25dc1, + 0x8ea53f1875e46b3f, + 0xce38dab872f56a9b, + 0xc8b1396872fb8a19, + 0xb3162ed87fedb985, + 0xf37a64ca9acfb7e1, + 0x46fb8cafeac2d65f, + 0xf48725b219d5f4cb, + 0x95ca82f54bea1539, + 0xadb597c768ec23a5, + 0xfd14b5ea98de6413, + 0xbe287c6ba5d2617f, + 0x78bd1e4a92c36fdb, + 0x2d5ef94dc1d68e49, + 0x1d37958fefc89db5, + 0x76ac4f321fadbc23, + 0x1b9da4532b9eca8f, + 0xe58bd2a549a2e8fb, + 0x14edfb687bd51a69, + 0x214e59dba7c928d5, + 0x796341fcb7dc4853, + 0x2db7481dc3bd45af, + 0x25843a91f4c1852d, + 0x7fc389d212d4a389, + 0x3c56bf2541c7a2f5, + 0x6d42f9e65fbac173, + 0xf39eb1754c79aebf, + 0x8bd7f417698fce3d, + 0x1fb645ddc8b31ea9, + 0x184fc7afe9b63d17, + 0x235bc9e1f6b94c83, + 0xf93a4272158a49df, + 0x41b9736323ae695d, + 0xe8f9db1653b187c9, + 0xb842ea1a91c4b837, + 0xea5df1798f97c6a3, + 0xfd6c718cbe9ad621, + 0xa28ed53dca8be37d, + 0x731f452dc87df2e9, + 0xcb659de21cb43257, + 0xa5f1367549a751c3, + 0x7b9cdae657a96f31, + 0x4f32ae77637a5e8d, + 0xc9d6f149827d6cf9, + 0xa321498ed291ac67, + 0xa8d7e63dcf74bad3, + 0xda73c821fe87da51, + 0xf539b7221c58e7ad, + 0xc5817fd43a6cf72b, + 0x682715354b8f1697, + 0xba2f61c98a9246f3, + 0xef41a83dc9a86571, + 0xd2fa693cb47863cd, + 0x6132485fe37c824b, + 0xdc8abe51f26e91b7, + 0xf658b3a54382bf15, + 0x9f4ac5843f64ce81, + 0x2c4af9d43a45cbed, + 0x27f45bc76a48fc5b, + 0x5694aed9895d1bc7, + 0x378b641dc97f2b35, + 0x541d63cfe87359a1, + 0xd7c89b3fe475681f, + 0x2b583ea21349867b, + 0x64d257e4324b95e7, + 0xb2136e79817eb465, + 0x9576e4d98f62d4c1, + 0xcd7841ba9c65d23f, + 0x719e2f5bac46f19b, + 0x315a4b9fec6b3219, + 0x68429adfe94c2f75, + 0x1d6a4f73285f4ed1, + 0xba946c5438526c4f, + 0x61bd9ef875346cab, + 0x419b875ba3478b29, + 0x15a2b739813cba95, + 0x8f13ba4a9e3db8f1, + 0x7a93546cbc31d76f, + 0x5fb8c2afea23f5db, + 0xbad94e332d381649, + 0x47a5ebf76c3a24b5, + 0xc5dfa3b98a4d6523, + 0x1c42afda973e528f, + 0x87e6d9bba64371fb, + 0xa3b9ed6dc3248f59, + 0x436ab2fed1279ec5, + 0x9c51af8fef1abd43, + 0xba39f4632e1dcb9f, + 0xe8ab67d65c32fa1d, + 0x921c5ae76d241b79, + 0x6a132de98b1729e5, + 0xdae814fdca1b4963, + 0x761e54dba71c46bf, + 0x38b9a5ddc51f763d, + 0xa3692781f51284a9, + 0xb75f24e43526b417, + 0xfc423a976419c283, + 0x179cf6d54ce8b1df, + 0xe6f27b9659eacf4d, + 0x6fa4721657cdfeb9, + 0xe3dfc2acbaf43e27, + 0xb9dea65dc8f64d93, + 0xa7f5839dc5d74aef, + 0x6e94fb5214fb5a6d, + 0x91ae6b3323fe68d9, + 0x25e8b3c763f1b947, + 0x6d357eb981f4c7b3, + 0x54387a6a9fe8d731, + 0xa4316f887bc9e48d, + 0x694ec37ba8cbe3f9, + 0x2f41bc9feadf1367, + 0xcb2f76321ae452d3, + 0xdc62a1b54ae87251, + 0xb8c197d434c75f9d, + 0x54e71ba764da7e1b, + 0x1ad4b83762ce9d87, + 0xb286fe7a92d1abe3, + 0x918cf3bbafc4db61, + 0x8cb2ed41fca5e8bd, + 0x76f924e21dc9f83b, + 0xab4c91743bcd18a7, + 0x13e98af76acf3815, + 0x1fb2354a9ad35681, + 0xab4fe3ca97b564ed, + 0x67ad48edc4d9835b, + 0x3db6c1ffe3db92c7, + 0x2a684ec1f2ceb135, + 0xe153d76543b2cf91, + 0xbd687ce32e83bcfd, + 0x8614f5e43c95fd6b, + 0x8269eca65ba91cd7, + 0x963e214989ad2c45, + 0x73d2485dc79f4ab1, + 0x79cf2baed7b3692f, + 0x689b7411f3c4678b, + 0xadc736f213b896f7, + 0x9518da7432acb675, + 0x7cbd9e57629eb5d1, + 0xebf924587e91d34f, + 0xb2f936c87d84f2ab, + 0xb129f5adcdb81329, + 0xf3c4b5dfecab3195, + 0xb425e93ed78b4fe1, + 0xeb2a57d2178e4d5f, + 0x68b9ae5435826dcb, + 0xf1eb527764a58c39, + 0x5e9f47a762879ba5, + 0xfc826d5a928bca13, + 0x43da728a9e5dc87f, + 0xe7f14b8bac71f6eb, + 0x5c9432a1fda41759, + 0x4e3a9d221d9826c5, + 0x69ae5dc32c9b5643, + 0xeb3df795487c539f, + 0x7f3e628a968f731d, + 0xb937681dc583a179, + 0x68ce3fdcb2749fd5, + 0xeb7691aed178be53, + 0xfea8547ede48bcaf, + 0x3f48b6921f5ceb2d, + 0xbed752954e621c89, + 0xa87cfeb76c742af5, + 0x6e4d37aa9c684a73, + 0xc3267b4ba85947cf, + 0xe3c629dcb85c674d, + 0x3a49ef2ed34f75b9, + 0xd351eba1f483b527, + 0x5a8f94321276c493, + 0xf95ca3254157b2ef, + 0x4d6f93865f4ae16d, + 0xcf847d365a3befc9, + 0x21d9754bac612f37, + 0x1724b6ddcb654ea3, + 0x96a2bfdfea586d21, + 0x9e4a8351f6395b7d, + 0x856a9322153c6ae9, + 0x7cead163243f9a57, + 0x51f9a4387452b8c3, + 0xecf1b56ba256d841, + 0x957fc6a98f27e59d, + 0x83a42e6a9d3af51b, + 0x648a539edc3e1487, + 0xac5e9831fb6154e3, + 0x18d9e6a32c457361, + 0xb36c97d5493761bd, + 0x291c467656397f2b, + 0xa1b254c7642c8e97, + 0x49c65bf9842e9cf3, + 0xa4dc287cb243dc71, + 0xd173854baf14e9cd, + 0xd3a25b1fed17f94b, + 0x62fb45743e2c19b7, + 0xd12453f76c1e3925, + 0x95d1ef698c325791, + 0xa7b25c19891365fd, + 0xdb6f31adc917846b, + 0x8daf143dc51a93d7, + 0x97a6d43fe61db245, + 0x1db23c9fe43fc2b1, + 0x8324ca665423ce1f, + 0x7af893532cd3fe7b, + 0xcd83b1554bf61de7, + 0x5dcfa8687bfa2d65, + 0x4a5c3be878fd4bc1, + 0x45adb27a97de5a3f, + 0x983ea7ced5f2689b, + 0x34578a9fe4f5a819, + 0xb68d932213f9b785, + 0x976abc2543fab6e1, + 0x412a87e761edc45f, + 0x12c537f76ed1f3cb, + 0xe6b9d48bade61439, + 0xca17546cbce832a5, + 0x9e64281edaeb6213, + 0x538b974ed7cb4e6f, + 0x7df5982216af5edb, + 0xb956f27436e28d49, + 0x873bcef763e49cb5, + 0x8dca421874e8cb23, + 0x283b74a761dac98f, + 0x5d83ce776e9cd7fb, + 0xa479123dced21869, + 0x3cad1791fbc427d5, + 0x793e68521cd94753, + 0xdb1683c328c954af, + 0x92af17d658bc742d, + 0x5bed324765cf7289, + 0xa846c25a96c3a1f5, + 0x21ce674ba2c5bf63, + 0xd68f2a4dc196adbf, + 0x8ed5f34cbf89ec3d, + 0x936b2fd21e7dfca9, + 0x2da8ec765eb23c17, + 0xfc9a28176dc54b83, + 0xe41f768659a648df, + 0xcdf34e6a97ba685d, + 0xd1ace63cb4ad76c9, + 0x3b98715ed4bfa637, + 0x537b4ed1f4b2c5a3, + 0x947f5ba434b7d521, + 0xcbf5739541a8e27d, + 0x783ae6554d7af1e9, + 0xe3d721f98dae2157, + 0xd54f1cb98c914fb3, + 0xaf17b8ddcba56e31, + 0x7df453bfe7965c8d, + 0x891d374fe4786bf9, + 0x739db652148d9b67, + 0x3d89b1a3247fa9d3, + 0xc315d24874a3d951, + 0xeda6cf187184e6ad, + 0xc3ae165a9e78f62b, + 0x2a7e985cbe8c1597, + 0x2eb1873dcb8d25f3, + 0x15e369a1fca26471, + 0x2659cfd21a8462cd, + 0xbf6791a43a97814b, + 0x7da815f434598fa7, + 0xadbc3629847cae15, + 0x4c75f36a936fbd81, + 0xa1e85b4a9162caed, + 0x3175d69dce64fa5b, + 0x67a951d1fe581ac7, + 0xdb523a421e7c2a35, + 0x5ce4fd243c6e48a1, + 0xfc37a1465b82671f, + 0x8e6bc14a9a63857b, + 0x4295d31cb85694e7, + 0xb863e9fed47ab365, + 0xcb795a1fe46db3c1, + 0xf4c9b73ed26ec13f, + 0xad954f843152ef8b, + 0x2491d8f43d451ef7, + 0x417bfa976d492e75, + 0xd6235b887b5a4cd1, + 0x2aebc519893d5b4f, + 0x958f6baed84169ab, + 0x9b2863ffe7548a29, + 0xbe3d9621f436b895, + 0x4fb1ce632549b7f1, + 0xfce9b325423bc56f, + 0x4a7b5cd7613fe4db, + 0x32e4fc7baf631549, + 0x34c2659bae4723b5, + 0xf418a67dcd5a6423, + 0x82faec4eda3b518f, + 0x1ef857bed72c5feb, + 0xd8b7f3e32a318e59, + 0xfb5e369547239dc5, + 0x59af42698627bc43, + 0xbc2f17e76327ca9f, + 0xdc4ab399823be91d, + 0x5fc924ebad1ef879, + 0x96eb4a2dcd1328e5, + 0x19426ca1fd174863, + 0xc9e64b332c1845bf, + 0x6b895fe54a1b753d, + 0x43f9c286581e73a9, + 0x5968be3ba942b317, + 0xa9d7c38cb725c183, + 0xfca6274a9315aecf, + 0x5e87f1acb218ce4d, + 0x3e4982cbace8fdb9, + 0xd9e15a243cfe1d27, + 0x14ecb9d65df14c93, + 0x8697cbf65ad349ef, + 0xad9b68e54af7596d, + 0x7bd9c24985fa67d9, + 0xf35d8e4cb5fda847, + 0x86abfeddc4efa6b3, + 0x379168afe5f4d631, + 0xa5647b2212f5e38d, + 0xb6c21ed541d7e2f9, + 0xba842e365fec1267, + 0x914e35687bce41d3, + 0xe734ab1a9bd26f41, + 0x241bec9ba8c35e9d, + 0x325de7fdc8e67d1b, + 0x391c8ed1f4ea9c87, + 0x9b85e4c215dc9ae3, + 0xc4f57be434dfca61, + 0xc19f832653c2e7bd, + 0xb735ef4981d5f73b, + 0xa591fbd98fd916a7, + 0xc46e5f9baedc3715, + 0x541b78eedbce4581, + 0x32a1b971f9b163ed, + 0x9cfb64321ad4825b, + 0xc4be67f438d691c7, + 0xca587d9546c9af25, + 0xc29f1b8764acbe91, + 0xb9c72f87628eabfd, + 0x2d415e3a91a2fc6b, + 0x27f93b5dcfa51bd7, + 0x3712ba41fec92b45, + 0x14ab9d332eac49b1, + 0x958baf143bad582f, + 0x39726f554ac1768b, + 0x7ae9b38768b395f7, + 0x5fb4891ba6c8b475, + 0xaebd6f3dc5a9b4d1, + 0x95a3e1ced39bc24f, + 0xa192c35ed28fe1ab, + 0x4c2f59d764c53129, + 0xbdf81ca43ea62f85, + 0xd76ebf865c984de1, + 0x3d9ae8c76b8a4c5f, + 0x8bd21397687e5acb, + 0xb9af36ced7a18b39, + 0xbdca756fe683b9a5, + 0x6d4e3521f5a7c913, + 0x3bced8a21389c67f, + 0xdb896ca4327ad5eb, + 0x941bef27618ef459, + 0xec7136298f9324c5, + 0x573c89fcbea86543, + 0x14a9285cbc78529f, + 0x9318ab6fea8b721d, + 0xfd4ca82fe85d7f69, + 0x5ecb3fa328719ed5, + 0xebd9c7332784bd53, + 0xbef861254365cbaf, + 0x816dae987368ea2d, + 0x31e54fc8715cfa89, + 0x5fb23debad6e19f5, + 0xe158973ede824973, + 0x19a467ffeb7546cf, + 0xc75a9e421c59764d, + 0x978e5d432a5c74b9, + 0x2b9c1ed6596ea427, + 0x87ef164ba871c293, + 0x45ea862a9564b1ef, + 0xfe9d573ba246cf5d, + 0xd23a874cb147fec9, + 0xa1863efedf5c1e37, + 0x69ed3ac21e5f2da3, + 0xbe186a965e746c21, + 0xfab827376c345a7d, + 0x18a324665b3768e9, + 0xfe985d7cb83ca957, + 0xf68392ecb64ea7c3, + 0xf1b4693fe862d741, + 0xd1536b41f253e49d, + 0x65e7b4c32357f41b, + 0xdc29e457625b1387, + 0xac3b8e587f5c42e3, + 0x8ef614ba9d4f5261, + 0x2c96ae398b325fad, + 0x275ebf4dca357e2b, + 0x5cd817afea268d97, + 0x97f6a13fe62a9bf3, + 0x84fca3b3263ecb71, + 0x172dfac54531e8cd, + 0x256bcfd87523f84b, + 0xe8c621dba23618b7, + 0x86593bfbaf1b3825, + 0xd1a458ecbe2d4691, + 0x1d47c26cba1e54fd, + 0x19658be1fc12836b, + 0x2b5ca4943b1592d7, + 0xef4591a76a29b145, + 0xcdb134865629bfa1, + 0xdc63ea58752cbd1f, + 0x3a718b2a9421fd7b, + 0x48aec79cb3241ce7, + 0x12f7e5acbef72c65, + 0x6cd35f2fedf84ac1, + 0x95b2cef21ceb593f, + 0xd46853a32afe579b, + 0xfadc94265bf2a719, + 0x45c96bd879f3b685, + 0x652b471a96f7b5e1, + 0xc8475b3ba4e9c35f, + 0x7ecfda3a93fae2cb, + 0x42e9d3adc2def139, + 0x943bdc2762f431a5, + 0x87de52643dc64ef1, + 0xf876d5943bc84d6f, + 0xc1af9de548e95cdb, + 0xaf42de9768de7c49, + 0x8d56217dc7e19ab5, + 0x73fca65ed7e5ca23, + 0x526b31cfe3d5c78f, + 0xa8d536b213c8d6fb, + 0xa78d5b4432dcf569, + 0x8b6ec24872cf16d5, + 0x2b83df7a9fd24653, + 0xb15e46d98dc653af, + 0x2345e71babc9732d, + 0xf26c714feadc7189, + 0x2875693ed6ac8fe5, + 0x3c6dbf4328c1be63, + 0xd49a3e632593acbf, + 0x7418629654a6eb3d, + 0xc931ed4652c7fba9, + 0x2385d76a93cd2b17, + 0xe634258a9ebf2a83, + 0xec2f473cbca247df, + 0x5c481a31fcb4675d, + 0xfba67d521db875c9, + 0x364f57b329bca537, + 0x4a279ed6579eb4a3, + 0xf7a4bc1a98b3d421, + 0x6573ce1a95a4e17d, + 0x38bd496ba285efd9, + 0xb7afe21ed2ba1f47, + 0x872c1f9edf8c2eb3, + 0x48e96d532e9f5d31, + 0xbae87c443e925b8d, + 0xe5f71bd43c846af9, + 0x53879ad54cb89a67, + 0x4ae2d71a967ba8d3, + 0x67afec8cb69ec851, + 0xbe172dfdc481e5ad, + 0xcf92748fe394f52b, + 0x697f4ae323b81497, + 0x2ad97ef7619a24f3, + 0xbd58c7e76f9d5371, + 0x72ed83176b7f51cd, + 0x2abc58da9c827f3b, + 0x89e2734dcb648ea7, + 0xd179246fe978ad15, + 0x6912d7a1f56abc81, + 0xcf64bd32145cb9ed, + 0xbe5d76843471f95b, + 0xb4ea3d17638419c7, + 0x428ef3ccb1a82935, + 0x2d5784aa9f6b47a1, + 0xf2417cebad7c561f, + 0x758b4fcedc5f647b, + 0x38e65cb1fb6293e7, + 0x7e235c621c87b265, + 0x7cbe68a54968b2c1, + 0x7f58bde54659be2f, + 0xac739bd7634cde8b, + 0x7b3d618ba4621df7, + 0xad4fe68dc1842d75, + 0xdb259e6dcf574bd1, + 0x6c93824fed395a4f, + 0xa59b32421e3d58ab, + 0xac961df43c4f7829, + 0xa1bd9fc76c42b795, + 0x7f359ad98945b6f1, + 0x3e4f9d5ba738c46f, + 0x28be54cba549e3db, + 0x65d9efbdc35df249, + 0xc1b6a8d1f47132b5, + 0xdf279c6654876123, + 0xf295adc43d264e7f, + 0x7efc59254c285deb, + 0x1a784cd76b2c7d59, + 0x863fd1a8792f8bc5, + 0xac149e3ed952cb43, + 0x3e564f7ed624c89f, + 0xae8d7411f537e81d, + 0x25b3d462142bf679, + 0xef428c77643d17e5, + 0x689d3c5ba2514763, + 0xbcd3f5998e1354bf, + 0x97c238fbae18743d, + 0xeb9358ddcd1b72a9, + 0xdaf8734feb3da217, + 0x16c724bed81eaf73, + 0x589641243712adcf, + 0xcad1b4e43715ec4d, + 0x21cab9d65416fcb9, + 0x4126dfaa953b1c27, + 0x59e4bfcba41e2b93, + 0x8f634b987bcd38ef, + 0x5a8d946cbcf2586d, + 0x51ba4d9febf476d9, + 0xcb2ed4f21cf9a647, + 0xf3647d8328fca5b3, + 0x3d8c7ae768fec531, + 0xfe3c4db876f1e28d, + 0x43d2abc985d4e1f9, + 0xdf67e38dc4f92167, + 0xa524e69cb1e92fc3, + 0x31c2a56cbfdc5e41, + 0x8d9e46521ebf4c9d, + 0x91db25c54de37c1b, + 0xcb9ef8543ce49b87, + 0x2b7c849658d7a9e3, + 0xd69534e987ebc961, + 0x2a7ec5b984aec6bd, + 0xf5b1ea2dc5d1f63b, + 0x4b5d27a1f3e415a7, + 0xef31ab9324e93615, + 0x4c9ed8a762eb5481, + 0xbe51ad254fab52ed, + 0xb7f35ae76dcf715b, + 0x89f12e576ac28fb7, + 0x4719dcfcb9c6ae25, + 0x56bd721fe6c7bd91, + 0xa87df54fe498bafd, + 0x3587cf22149dea6b, + 0x7ef8a51545c21ad7, + 0xace675f983d62a45, + 0xf62cb3aa92d748b1, + 0x6a3c54f98eba572f, + 0x1d723f5a9ead658b, + 0x61b87dfdcbae84f7, + 0x7d4e1391fac2b375, + 0x5d4e7fa329a6b3d1, + 0x9b15842437a8c14f, + 0x14d825c43478df9b, + 0x2b39d1c7648cfe19, + 0xdb46cf8ba4b12e85, + 0x574c983cb2a54ce1, + 0x2eab5fddce974b5f, + 0xb461a8e1fe7859cb, + 0x7a9fd8521e8d7a39, + 0x1d7b3f632c7f98a5, + 0xac5782b76ba4c813, + 0xd8a794e76894c57f, + 0x5bac324a9587d4eb, + 0xf9273d1dc48bf359, + 0xe96ab1ced49e13c5, + 0x62ce48d1f5b16243, + 0x74862c1432a4519f, + 0xe5fb46c32d765efb, + 0x24fcb1943d5a7e69, + 0xa35c79154a6b8cd5, + 0x56c9def9897fac53, + 0x69cf28ecb762c9af, + 0xaf5362bdc675e92d, + 0x87d51a9fe356f789, + 0xdc9ef683247b18f5, + 0xa367dfb6549e2873, + 0x849b35a8728145cf, + 0x5cba4e1a9f83754d, + 0x897462bbae5673b9, + 0xd962fe7dcd6ba327, + 0x7d6b91cfea6db193, + 0x847efd5cb64c9edf, + 0x8eb9f5321862ce5d, + 0xa17dc6f32654fdc9, + 0xa6d791c985691d37, + 0x92b57c19846b2ca3, + 0xf56ce1dba37e5b21, + 0xe532761cbf41597d, + 0x43df72adcd4367e9, + 0xcd528911fd36a857, + 0xfe5274621d49a6c3, + 0xcb816d743a5dc641, + 0xc91f67a6574fc39d, + 0xfd6e32aa9864f31b, + 0xfed9763dc9561287, + 0xab93ef6dc56941e3, + 0x9b2e5a4ed26b4f51, + 0x7e25d83cbf2c4ead, + 0xa52946d43f417d2b, + 0xc5b8d9e54e238c97, + 0xad1b84265c269af3, + 0x1a2be3d76b39ca71, + 0x3adceb59862ab7cd, + 0xc215de3ba62fe74b, + 0xd451239fe84316b7, + 0x2c3ea7d1f6483725, + 0xcd6ba513263a4591, + 0x8b4952f7612a53fd, + 0xab9126f65f1e726b, + 0x6952b1c98e3291d7, + 0x3275e8ca9c14af35, + 0xd79e32bdc926bea1, + 0xe957f26ed728bc1f, + 0xe2b3c861f51aec7b, + 0xf7965d43251dfae7, + 0xc1b9f4d878132b65, + 0xf97a65d9852649c1, + 0x52e34cfba219583f, + 0x8fcb96a87efa569b, + 0x437f58cbacfd8619, + 0x4f9e5a8dcbefa485, + 0xebc9a74ed9f3b4e1, + 0xd82c5b3219e6c25f, + 0x1ab8cd5436f7e1cb, + 0x8c12965545daef29, + 0x8c5d3ea874ed1f95, + 0x7d4b1afa95e24df1, + 0xb39fd52ba1e34c6f, + 0x7c318daa9fe65adb, + 0x32b58a71fdea7b49, + 0x7a9246821ced89b5, + 0xc2a6d7f54adfb923, + 0x82615ed549d2c68f, + 0xbcd841e767c4d5fb, + 0x6b8e42cba5d8f469, + 0xe479bd8ba6eb14d5, + 0x186b47edc6de2453, + 0xcfb2d41fe3d152af, + 0x37a562f543e5712d, + 0xbf517c332ec56f79, + 0xb9cf51d43cb98de5, + 0xf8e2943659bcad63, + 0xab231e96568e9abf, + 0xfa531dea97b2ea3d, + 0x6ba1295ed5c4f8a9, + 0xeab6c411f5d92a17, + 0x9b7326a215dc2983, + 0x53c1df7542ac36df, + 0x1ce7f6d982c1765d, + 0x7c1d89276fb374c9, + 0x68275c1a9ec8a437, + 0x15d4f9a98dc9b2a3, + 0xf26ac37fe9adc321, + 0x74b9da2dc58ebf6d, + 0xcdb26f421682fed9, + 0x7ab59e8438b61e47, + 0xcf359d2765a82db3, + 0xda613c5984ab5c31, + 0xf6edb3c8719e4a8d, + 0x146aed2cbea168f9, + 0xa3524bfedeb3a967, + 0xc4d738a1fc96a7d3, + 0x8d96ef532d9ac751, + 0xb6dce593287bc4ad, + 0xa362c4e6578fe42b, + 0xe5b62d3ba8b41397, + 0x47adfc1cb6a742f3, + 0xf12e98ced4ba5271, + 0x5f2eb9adc1794fbd, + 0x15378e4dcf7d6e3b, + 0x1be678d32f618da7, + 0xde9417543e84ac15, + 0x8b9a57d54d76cb81, + 0x8761cd954957b8ed, + 0x5bca421a976ce85b, + 0x4de18f6ba45ef6c7, + 0xa734d29fe7a42835, + 0xa9c56141f39746a1, + 0xd4f35ca32389651f, + 0xdb8c3fe5418c637b, + 0x8b219d354f5d82e7, + 0xa3517cba9e82b165, + 0xec32da698c64afb1, + 0xe32f58dba956bd2f, + 0xef1495adc647ed8b, + 0x3cb5496ed54aebf7, + 0x14d59ae3286f1c75, + 0x684d1c9656734ad1, + 0x3ba7f2d98276594f, + 0x6e35c41a914857ab, + 0x84bd6f9baf4c8729, + 0xcfa6d41cbd3ea695, + 0x291c834edc62b5f1, + 0x95a8bfdfea54c36f, + 0x64a539821946e2db, + 0x947f58c4385af149, + 0x41fe3bd8786d21b5, + 0x17e38d6a976e4f13, + 0xc82d154ba3524d7f, + 0x1e2f358ba1345ceb, + 0xb45f6caedf287c59, + 0x4e186251fe2b8ac5, + 0x32f59de21d2eba43, + 0xcb361ea54b31c79f, + 0x3d2e84776a34e71d, + 0x36fb4e198a26f579, + 0x9d73ac1cb83a16e5, + 0xb71526ddc84d2563, + 0x1f73269dc52e43bf, + 0x8da57b61f154723d, + 0xf63715a5423571a9, + 0x14e867b43d178ef5, + 0xce624af65d1bae73, + 0x1fc89d76581d9bcf, + 0x437ab9c98921eb4d, + 0x3659a42dc713fab9, + 0x8c936bffe9381b27, + 0xa9816c71f61b2a93, + 0x3efd14b3251b37ef, + 0xd3fb1626531f476d, + 0x9eab6c79831275d9, + 0x4b75fe998ef3a547, + 0xaf534bc98df7a4b3, + 0x5bd28a7a9bfac431, + 0x8d5f7c6ba7fbc18d, + 0x1e49623ba5bdcfe9, + 0xa3df481329e31f57, + 0x5de621a547f62ec3, + 0xa438c62876f95d41, + 0x1235c8a762fa4b9d, + 0xcb3fd41982fe6a1b, + 0x9e14cfdcbfe19a87, + 0xfa749c2cbcd4a8e3, + 0xed9617b1fbe7c861, + 0x4bac6f7219e8c5bd, + 0xe385d14328dce53b, + 0x3c8d769546cef3a7, + 0xc95d8bfba9e63415, + 0x687cae3cb6e75381, + 0xd73852eba3c851ed, + 0x3ab1547dc1da6f4b, + 0x85fa726dcfad6eb7, + 0xc7261a843fc1ad25, + 0x5942dec43ed4bc91, + 0x6aef2d7438a5b9fd, + 0x65cbe23547c8e96b, + 0xf341db9765abf8d7, + 0xdf872accb7cf1945, + 0x1629bc7fe6d347b1, + 0xf48627dfe3c7562f, + 0x5cad4e7212d9648b, + 0xeab5836541cb83f7, + 0x71de6f854fbea275, + 0x1a593d287ea3b2d1, + 0xce8346187a94be3f, + 0x587f64eba785de9b, + 0x38db614dc6a8fd19, + 0xa63d2b81f6ac1d85, + 0xd7ac1b83269f3be1, + 0xa42c597436b24a5f, + 0xc42f587762a458cb, + 0x8a4bc92761ca7839, + 0x7825cfe76f8c97a5, + 0x12c3fb4bad9eb713, + 0x68e31abedb91c47f, + 0x52b34181f984d3eb, + 0x24b9dce21ba7f259, + 0x19a7c525489a12c5, + 0xc5946f3878ad5143, + 0x7f2dc897647d3e8f, + 0xfae18dca93825dfb, + 0x179f8bedc1a47d69, + 0x3b7d42adcf678bd5, + 0xc682a511fe7cab53, + 0xd7a658c21c5db8af, + 0xad1678354b71e82d, + 0x2b5186e54b73f689, + 0x3da52fc76a9817f5, + 0xa31948edc89b2673, + 0x21bce93ba57b34cf, + 0x64937aedc28f634d, + 0xb19c3ad1f18372b9, + 0xfb8153654396a127, + 0xe1f573432e57af83, + 0x752ef1a43b489cdf, + 0xf2b1e837694ebc5d, + 0xdc6f98587851fbc9, + 0x5318e24eda851c37, + 0x35821f4fe8672ba3, + 0x1e43d2b1f67b5a21, + 0xe2953d42135c487d, + 0x7f4cb164324f56e9, + 0x38d5efba9182a657, + 0x42fac5998f46a5c3, + 0x39c7e1bbae69c541, + 0x9d642ea98b4ac29d, + 0xe9532d1dc95de21b, + 0x24c59de1fb632187, + 0x6745ca8219652fd3, + 0xa9b84e1439684e51, + 0xcfb5e29765384cad, + 0x673b5af9834d6c2b, + 0xd3c652fba13f6b97, + 0x4ac8e59cbe42a9f3, + 0x14f732eede35c971, + 0x1e735dc1fa27b6cd, + 0xa37c56b21c2ae64b, + 0x85a6c414392df4b7, + 0x8a37cd2a9b713625, + 0x85f42a6cba365491, + 0x167c935ba63752fd, + 0xe91c267ed43a716b, + 0x1f93a24ed12b6fc7, + 0x169a8f7dcd1f9e35, + 0x598a2ed54f23bda1, + 0xf2cdbe554d25cb1f, + 0xcf597a254c16ea7b, + 0xf9b8ae76581af9e7, + 0x932f845cb92e1a65, + 0x3e2914aed93248c1, + 0x3c5a8b4ed814573f, + 0xe249a7b1f317659b, + 0x152ca864342b8519, + 0xd3285f47621da385, + 0x269317b65cfda3e1, + 0xdec96b187be2c15f, + 0x53bc1ed768e3dfab, + 0xc465389ba8d6fe29, + 0x36de7fbdc7fa1e95, + 0x5e473caed6eb3cf1, + 0x8a96735215de3b6f, + 0xae7bd65434f259db, + 0x4a53f1e762f57a49, + 0x9dc3f54761f798b5, + 0x9d4bfca87fecb823, + 0x14e5bf687acdb58f, + 0xc5d3b74ba9c1d4fb, + 0xc7a8f92fead4f369, + 0x57a4e9d32ae813d5, + 0x3f24be7769eb4253, + 0x738c1b6656dc41af, + 0xc368aef874be5f1d, + 0x5c84de9ba3d26e79, + 0x78b51edba1d48ce5, + 0xce8a4f6cbfd8ac63, + 0x7c86134fedc8a9bf, + 0xfec9d7521baec93d, + 0x5f92e7a43bc1f7a9, + 0xd31e5b776bd52917, + 0xa73fe5876ad92783, + 0xaefc623986b935df, + 0x5c4917eba3bc645d, + 0x98a34e2ed2bf63c9, + 0xed421a61f1d4a237, + 0x271e8cf542d6b1a3, + 0xf59e8c432c869def, + 0x8dc271543c89be6d, + 0xcdf76985487becd9, + 0x3674cfea9ab21d47, + 0xab9384eed8a52cb3, + 0x2b5937afe7c85b31, + 0x5c82e3b1f3ba498d, + 0x3bc7d2e213ac57f9, + 0x2f17e6d432bf9867, + 0xfd281ec871b2a6d3, + 0x7dce39b98fa7c651, + 0xcbd8f4576e87c3ad, + 0x153cf62a9c8ae32b, + 0x4b2f57ddca8df197, + 0x15c8ba6fe9a241f3, + 0x35a4697329a54f61, + 0xa5de869325864ebd, + 0xadc284f654896d3b, + 0x368d14f6528d6ca7, + 0x8f432d1ba28f9b15, + 0x12738facbf73ca81, + 0xdb7f6e9bac64b7ed, + 0x8e7ca4d1fc68e75b, + 0xa6ce25b21b6af5c7, + 0x2af78d154b9e1735, + 0x318c4b987b9245a1, + 0x17d6953ba895641f, + 0xb8d495adc498627b, + 0xe5a3b2fdc36a81e7, + 0x5b8a4eced17c9f45, + 0xef73958dcd5f9eb1, + 0xef2a45921e63bc2f, + 0x6d1b7ae32d54ec8b, + 0x4a689ce43b46eaf7, + 0x5fa124d98a6c1b75, + 0xb3512ecba86e39d1, + 0x19738b2dc971584f, + 0xd8f25a7fe47356ab, + 0x283d7ab1f3578629, + 0x68f2b7c2126ba495, + 0xa92d8bf6526ca4f1, + 0xe8643d165d4eb26f, + 0xcf85ea987c53e1db, + 0x2a94c3e98b45ef39, + 0xdb2148adcb481fa5, + 0x2b9e536ed96b4e13, + 0x15468a2fe64d3c7f, + 0xf7e51b6327415aeb, + 0xba519c6326437b59, + 0x1358df28723689c5, + 0xc926df19815ab943, + 0xc84e53187e2cb69f, + 0xcab1d82a9b3fc61d, + 0x7615a94edc32f479, + 0xbe3dc611fb3714e5, + 0xc7fa3d621c5a2463, + 0xdfbac846583a42bf, + 0x86ae3f58784e613d, + 0xb65214fba5316f89, + 0x8b63d27ba4238df5, + 0xde5b91fdc126ad73, + 0x67f254ecbe179acf, + 0xa1c52691fe1bca4d, + 0x96ae35f32c1fe8b9, + 0x325bd9776d341a27, + 0x36982df87c162893, + 0x46c5da98791836ef, + 0x9f475d2ba81b456d, + 0xd29f815cb51e64d9, + 0xb5c8a67fe621a347, + 0x918b6ed1f415a2b3, + 0xf8253ae76548c231, + 0xe197a6f32ce6bf7d, + 0x49b56f843af8cde9, + 0x9f135da549ecfd57, + 0x9d5c6b4989f12dc3, + 0x39d825fcb9f65c41, + 0x8392f5adc5f64a9d, + 0x12f895bfe4fa691b, + 0xc7a932e213fd6987, + 0x97efc85542df97e3, + 0xda62493982f3c761, + 0x24edb9876fe5c4bd, + 0x538cead87cd8e43b, + 0x96b517e989dbf2a7, + 0x56a94f1dcade2315, + 0xa5cbe481fae35281, + 0xd64a879217b34fcd, + 0xacb4816325d76e4b, + 0xc9fbd3a543e96db7, + 0xed2b4a3873ed9c25, + 0xfedb8ac872dfab91, + 0x1f4a53e87ea2b8fd, + 0xb625c18badc4e86b, + 0xd578f1bfeab8f6d7, + 0xd34f9a732bdc1845, + 0xd7ec935549ce36b1, + 0xdc26a49879c1652f, + 0x864a52da97d4638b, + 0x17f24e3ba4c682f7, + 0x8f1ab94dc3dba175, + 0x4a257beed2ab9fc1, + 0xa73dce2cbc8ead3f, + 0xc7f6b2321f82ed9b, + 0x1a4dc9e43da5fc19, + 0xb196cfa54db91c85, + 0x82be1f97689b3ae1, + 0x354cf7a987ad395f, + 0xf91843eed6a157cb, + 0x679d821fe5c48739, + 0x84e692d1f2c796a5, + 0xb5fe943324cab613, + 0xc67db835419cb37f, + 0xc7513fe54d7fc2eb, + 0x32a564b87da3f159, + 0x8eb263aa9da721c5, + 0xa1963e2dcba94f23, + 0x874e6bddc67a3d8f, + 0xd374698fe57d4cfb, + 0x1365ca7325a17c69, + 0xde3519c324938ad5, + 0x43c9e7576297ba53, + 0x24a39fc65168b7af, + 0x6b9fae498f6bc72d, + 0xe834bd5bac6fe589, + 0x23f4658edc9316f5, + 0x86d39e71fca82573, + 0x9d84cfa21a7843cf, + 0x541f8be4398b624d, + 0x6187fca5457e61b9, + 0xe3461cdba5829f17, + 0xfc812decb274ae83, + 0xe436985ba1659bdf, + 0xdb23971baf48cb5d, + 0x48b2ed91fd4beac9, + 0xd342bfe21c5efa37, + 0x78396c465d7429a3, + 0x13987b276c875921, + 0x473fb5e98a59467d, + 0x864cbe3ba74b65e9, + 0xa67fe83dc36e9457, + 0xd8b4672fe571a4c3, + 0x9e48bc21f286c341, + 0x4781a5d43256c19d, + 0x415d9ce32d37cef9, + 0xb25613e54c3bfe67, + 0x6ac23de87a5f1ed3, + 0xdfb4967bab734d51, + 0x87941addc8354bad, + 0x97bfd61fe7486a2b, + 0x5d483ba1f43c6a97, + 0xaf863eb2154d98f3, + 0xf432c5e76452c871, + 0x98bec3d87143b5cd, + 0x9adb47398f27e54b, + 0xf321d9b98d29f3b7, + 0xd6e218fcbc6d1425, + 0x8597b31edb5f4391, + 0xf483c62fe94351fd, + 0xacdb87f219246f5b, + 0x814eb6f435286ec7, + 0x831ce658762b9d35, + 0xe394df58743e9ca1, + 0x3ab5e14a9342ca1f, + 0x7164debbaf13e97b, + 0xd852c97cbc15f8e7, + 0x98154bd1fd2b1965, + 0xcb3a8d954b2d37c1, + 0x814ed3f65a1e463f, + 0xf8943bd87a12649b, + 0x7e6f54acba268419, + 0xfb43a98dc619a285, + 0xe73ab65dc53ba2e1, + 0xe57923ccb21cae4f, + 0x569c13d989dfceab, + 0xcb7368d21ce3fd29, + 0x78fd5be43cf61d95, + 0xca2e74165ae83bf1, + 0x694fed2658eb3a6f, + 0x3f25bd6876fe48db, + 0xbed5a71dc6f17849, + 0x831ef29ed4f397b5, + 0x8249ac3fe4f8b723, + 0x8cf7e29212e9b48f, + 0xbcda8f9541eac3fb, + 0xb165c2354dcfe269, + 0x67b125d98ce412d5, + 0x35c7e2bbace84153, + 0x27b3f54ba8c73e9f, + 0xf961425cb7ca5e1d, + 0x62a549d1f4ce5d79, + 0x987ce4d326d18be5, + 0x67ac1b5325e4ab63, + 0xdec7168542d5a8bf, + 0xf1d3aec761e9c83d, + 0xd8e9f3265fbce6a9, + 0x742afd3a9cbef617, + 0xa369157fecd42683, + 0xb982f46fe9b634df, + 0xbef36ad21ac9635d, + 0x152fcea437db62c9, + 0xa319ef6656ce9137, + 0x5694831875c1af93, + 0xa2f9c63872a39cef, + 0xe137bf6a91a5bc6d, + 0xb3479ecbaf87ebd9, + 0xf482169fed9cfb47, + 0x9d54e7f32d9f1ab3, + 0xd81429376dc45a31, + 0x9d81c5a43ab5478d, + 0xae59237547b856f9, + 0x769ebc3ba4bc9567, + 0xe736af5cb4ae95d3, + 0x41bfd95fe6b2c451, + 0x215bc471f194c2ad, + 0x8e2cb59543a7e12b, + 0x659c3d132d69ef87, + 0x46bda3965c8b1fe3, + 0xbaf294e87b9f3e61, + 0x95821bd879824cbd, + 0xe631a9ced8956c3b, + 0x5216cd7fe4986ba7, + 0xae64b591f48c9a15, + 0x6be53da3247eb981, + 0x62ef3c554381b6ed, + 0xd65f89b87193e65b, + 0xd9fab6165e86f4c7, + 0xcdf4e67bae9b1635, + 0x2cd341ecbc8d34a1, + 0x7f89132dca8e531f, + 0xdc25eb71fa93617b, + 0xba8dcf2219846fd7, + 0xfdca43e326789e45, + 0x62b19fa6546a9db1, + 0xf3c416a8736dab2f, + 0x8512f6da9261ea8b, + 0x76d132cbad53e9f7, + 0x162e8acede681a75, + 0x8c13a421fc6a38d1, + 0xe32f8b421b6c374f, + 0x1b9c5e83296f45ab, + 0x4dfae5876b738529, + 0xd6e158ccb876a395, + 0x9f46173cb568a3f1, + 0x3ed81b5dc35ab16f, + 0xcb8f17aa914dafcb, + 0xa5143fedcd51fe39, + 0x4c59df832f641ea5, + 0x816b7e365e684d13, + 0x829bc1f65c493b7f, + 0x7af981e7683c49eb, + 0x97f46cdcb83f6a59, + 0x5971b64ed74298c5, + 0x31c5fd4fe756b843, + 0x35db9a1fe237b59f, + 0xe9348563234ac51d, + 0x391fbc86514de379, + 0x9e2f65798f6213e5, + 0x7319bc5bae574263, + 0xea25b74a9c3741bf, + 0xce9a1f2cba395f2d, + 0xaf4ec98ed72c5e89, + 0x86e9351ed62e7cf5, + 0x6ab8ec921842ac73, + 0x67a1fbe43524a9cf, + 0x841297b76327c94d, + 0x23dbf7e7612ae7b9, + 0x81f3a4ca9e1df827, + 0x9f6ad87dce412793, + 0x39d8e52dcb1435ef, + 0x43be7561fb18546d, + 0x14579de32b1a63d9, + 0x4f726ea65a1d9247, + 0x51bc8e27672f91b3, + 0x3d84e72a9734bf21, + 0x38c5afba9314be7d, + 0xce8d3f1ba216dce9, + 0x5b93f7dbade9fc57, + 0xfd496a1feafd1bc3, + 0x3ead1b932cef3b41, + 0x92ae1f743bf2489d, + 0x1de63af54af5681b, + 0x32fe8c1545fa9687, + 0xf41a3c5985fb96e3, + 0xdbfc649ba4feb561, + 0xce4b367ba4f1c3bd, + 0x71bfea3ed1f5e23b, + 0xb129a84432e6f1a7, + 0x1c9d74e76feb3215, + 0x4d8913b65bdc3f71, + 0xe1f9a43658af3ecd, + 0x96d7f3e989e26d4b, + 0x7613f4bba8e46cb7, + 0xcb315eaed6e89b25, + 0x28a1ebd1f4ecba91, + 0x7c89def213bca7fd, + 0xb358d1a543d1e76b, + 0xabf42c1761c3f5d7, + 0xae7d3bc98fd91745, + 0xc9d2fe598eda35b1, + 0x7a286bea9abc542f, + 0x6398e5ced9cf528b, + 0xca8f1b4fe9c381f7, + 0x365ef78218c49f65, + 0xb8e2c56435b79ec1, + 0x8cbde6f654b9ac3f, + 0xefa869d6528edc9b, + 0xcb49fd5983c2fb19, + 0x4d61f85bafc41b85, + 0x62f9387dcdb739e1, + 0xd59482afecba385f, + 0xdb7e3ac21a9d46cb, + 0xc637fbd32abf7639, + 0x2458fec768c294a5, + 0xdab865ea98c7b513, + 0xb147c3ea94a8b27f, + 0x387ef9bba389c1eb, + 0x53dfea8cb18cdf49, + 0x78e4f39ede921fb5, + 0x97d5ca821fa64e23, + 0x5673c8a32d963c8f, + 0x5ef719443c784afb, + 0xcba76e354a8d5b69, + 0x2f86397ba68f79d5, + 0x2fa57c4ed7a2b953, + 0x5c1a47eed384b6af, + 0x4ed129b1f398c62d, + 0x923e8d42127be489, + 0x8c512b75418ce3f5, + 0x3fae2c998fa12473, + 0x3f9164e87d8542cf, + 0x28c753dbac98614d, + 0x35e47bddcb685fa9, + 0x9aec137ed96c8e17, + 0xf23149bfe56f9d83, + 0x4769ca5215629adf, + 0xe8a1c4d32374ca5d, + 0x937ae8654256e8c9, + 0xbc473699816bf937, + 0xdf81b24a9f6e18a3, + 0x391b854dce935821, + 0xfb1cad7fec83457d, + 0xd5a14e91fb5764e9, + 0x6cbe47f21c6b9357, + 0x72a56195486d92c3, + 0x32f74ca7687fb241, + 0x92eb34a87452bf8d, + 0xbf4735298254cdf9, + 0xac4de7fcb148fd67, + 0x234f68acbf5a1cd3, + 0x59b278d1fd6e3c51, + 0x978bc3532e5149ad, + 0x84fd75b43d54692b, + 0xe258ac954c356897, + 0xe82cf4d7684a97f3, + 0xc9753deba84db671, + 0x5fc1a7ea953fa4cd, + 0x4f6187bed562e34b, + 0xda7cb94fe145f2b7, + 0xa34921b7647a1325, + 0xe8d34b276f5c4291, + 0x96d3ae865a2b3fed, + 0xf92a16d98c316e5b, + 0x46ad5b2a9a236dc7, + 0x58f169ceda279c35, + 0xa26cf3bfe6389ba1, + 0x2815364fe53cb91f, + 0x5684afc2142fd87b, + 0xa1b796865432f6e7, + 0xc85726fba2371865, + 0x63e2f9a98f2936c1, + 0xe1df34ca9d1b453f, + 0x42f6d9cbac1e539b, + 0xca4b193fec428319, + 0x169b5e81fb24a185, + 0xa12ced6438269fd1, + 0x81e647c43618ad4f, + 0xf94b7cd65419cdab, + 0x415832c8741fec29, + 0xefd57a8cb4231c95, + 0x1c8e462a9de53af1, + 0x8ca265ecbce7396f, + 0x17f36adfeaf947db, + 0x753ce2621bfd6749, + 0x8a1496b329ef86b5, + 0xfb4dec9879f4b623, + 0x21b356e876e5b38f, + 0x179f54a984e7c2fb, + 0x684bef3ba3fbe169, + 0x34acd8fa91dbefc5, + 0x42fe81adced12f43, + 0xc9567f221ec43d9f, + 0x5167f2843be75c1d, + 0xdce96f143bea5c79, + 0x51a78f2548dc7ae5, + 0xe2fa571987df9a63, + 0x5cd31b4a95d2a7bf, + 0xc879ea3cb4e5c73d, + 0x6843b1c1f2d7e5a9, + 0x18ac9e5323dbf517, + 0x251d7b9762de1583, + 0x81a9e4f76eb143df, + 0x63a5dfe98ec4625d, + 0xc19ba6598bd761c9, + 0xe8a7d26cb9ca8f27, + 0xcb36a27ed6bc8e93, + 0xd54be32dc49d8bef, + 0x63b4259215a2cb6d, + 0xcf87649323b4ead9, + 0xa71ec2d652c8fa47, + 0x9bf3614872dc19b3, + 0x51ec36798fbe4931, + 0x73ce952baeb1468d, + 0x7b3f89eedcb365f9, + 0xc36d5721fbc89467, + 0x6de8a3b218ba94d3, + 0x5d69c31548adb351, + 0xc7abd6e5458fb1ad, + 0x9df231c87593df1b, + 0xdce6a78a92a4fe87, + 0x937c85ecb2a81de3, + 0xb673d51dcf9b3d61, + 0x3e29a811fc7e3abd, + 0x758d91332e916a3b, + 0xc5af19632db369a7, + 0x8baf35654cb7a915, + 0x9c1dbe26569ab781, + 0xe21cfa49847ba5ed, + 0x6e175cbba38fd45b, + 0x7fc3861ed492f3c7, + 0x574cb281f2b81435, + 0x436ea97652b943a1, + 0x716eb9854e8b521f, + 0xe48762143c7d4f6b, + 0x2416abe65b816ed7, + 0x14fd837bab839d45, + 0x827f35bed8769cb1, + 0x32b9f1ced568ba2f, + 0x854c27e1f35cd98b, + 0x7623cf92135ed8f7, + 0x5a7c3ed764a31975, + 0x7b543ca9829637d1, + 0x67f321498e79364f, + 0x2f51bd398e6c54ab, + 0x9c7856acbc6e7429, + 0xf5bd294fec71a295, + 0x265c3b1fe975a2f1, + 0xd59cba321846ae5f, + 0x8cdb96432547aecb, + 0x5d9baf47645bed39, + 0xfda35988724efca5, + 0x3afe2d4cb2854c13, + 0xc9f27d1cbe453a7f, + 0x4d65e21dcd3748eb, + 0x15b3cd91fd3c6859, + 0x594cdea21b3e87c5, + 0xa9f1d3c65c61b743, + 0x57cd19376853b49f, + 0x376f41ba9857c41d, + 0xae9f5c1cb54ae279, + 0x6fcd328ba34bf1e5, + 0x52f7ec9ed47f2163, + 0x48abf3ddcd423eaf, + 0xec8b53621f365e2d, + 0x169ed5443e275d89, + 0x9651db354c2a7bf5, + 0x918dc5376a2e9b73, + 0xd1e84bca9731a8cf, + 0x9af34c5cb723c84d, + 0x4f8b769ed425e6b9, + 0xd6c472afe43af627, + 0xb17def93254d1693, + 0x4cd7e357613d24ef, + 0x7d35a4198f12536d, + 0x3e4f12698e1562d9, + 0x4fe9a76cbd2a9147, + 0x89e4afbdc91b8fa3, + 0x2f7361bdc83dae21, + 0x9264b5c1f621bc7d, + 0xfc347d132613dbe9, + 0xe5fd18c43416fb57, + 0xfeb2c83875291ac3, + 0x632e184a952d3a41, + 0xf94be1d76cfe379d, + 0xceb3d89badf2671b, + 0x79561feedcf39587, + 0xeb76f1aedaf795e3, + 0xbc83f16329fab461, + 0x7f9856e436fca2bd, + 0x9a218bd656efd13b, + 0xf5be2a1764d2ef97, + 0xace5f3ba94d61ef3, + 0x6493825cb2f93e71, + 0x215af4398fe93bcd, + 0x178e9d51fade5c4b, + 0xe1d56a732de16ab7, + 0x47cb61243ce49a25, + 0xd197e3854ae6b891, + 0xf587dbc545c8a6fd, + 0xcb5f14e984ecd56b, + 0x27c35afa93bfe4d7, + 0x2af915bed7e31645, + 0xd1865741f2e734b1, + 0x2f7cbe5541d9532f, + 0x214d5ac43fdc518b, + 0x792f5d143bac5fe7, + 0xcd2be4687bc19e65, + 0xc63af2e878b49dc1, + 0xea351c4a97c6ab3f, + 0x3da8269fe4c7da9b, + 0x53c869d1f4bcea19, + 0x984a5cd213bef985, + 0x7b8e35d765c438e1, + 0xa657123981c6375f, + 0xce974b876fa845cb, + 0x2e3d91f98ebc7539, + 0xafde721a9cbe83a5, + 0x2f398a7feac2b413, + 0xbd86713fe8a4b17f, + 0x89f36dc21685afdb, + 0xcd3b748325a8de49, + 0x8a571fc5438afdb5, + 0x537d69a985af1d23, + 0x6712ea4a91a23b8f, + 0x7183c6dbae8549fb, + 0xa817e34edeb85a69, + 0xa4657d11fc9b78d5, + 0xf42d89b21c9ea853, + 0xbe98fd443981b5af, + 0xc348d2a76894c52d, + 0x5c1342e875a6e389, + 0x19dfe2cba489e2f5, + 0xa39bd5edc5ad1273, + 0xd142537cb28e31cf, + 0xf69e3d1dce825f3d, + 0x6e9fbc821f745ea9, + 0x9148ebc43e698d17, + 0xdb1ce2f54d6b9c83, + 0xbc9df215475c89df, + 0x14ef523ba871c95d, + 0xfc6a852cb563e7c9, + 0xc2f8693ed496f837, + 0xb9845c71f48b17a3, + 0xd584b194359d4721, + 0xf268ae96518f347d, + 0xad4826765f7263e9, + 0x952137bbae869257, + 0xe8b762dbad6891c3, + 0xd93ae2fdc96baf31, + 0x58f6d79cb64cae8d, + 0xc9fb341fe651dcf9, + 0x4a7b59d21853fc67, + 0x6b528df545671bd3, + 0xfb491da9847a3b51, + 0x2d5ac648715c38ad, + 0x7ea3b4da9e4f582b, + 0x58f2d34dce428697, + 0x65e392cedc4596f3, + 0xb243cd51fc49b571, + 0xd5b6fa821849a3cd, + 0x49f7e164385ed24b, + 0xfc1938576852f1b7, + 0xdae951fcb9873125, + 0xe36d159cb4573f81, + 0x57c4f89ba1483ced, + 0x25bf6dcbaf2c4d5b, + 0x64a8b59fed2f5bc7, + 0xea2947521e429b35, + 0xc8e7ab554d35b9a1, + 0xd8c3be765a37b81f, + 0xc317ed86582ad67b, + 0x143cf82a962cd5e7, + 0x437659ced9421765, + 0x8391bc6fe74635c1, + 0xbd62a3cfe128543f, + 0x713a56c5413a529b, + 0x8b4ca1f65f3d7219, + 0x736ce9d54c1e8f75, + 0x2d54f9187b239ed1, + 0x762193e98915ac4f, + 0xb2d185aa9716dcab, + 0x92f6bc8ed61aeb29, + 0xf9436dbfe41dfa95, + 0x6c28b316574239f1, + 0x59c6b1387514386f, + 0x1be45d99821746db, + 0x7dc26bf65efa7649, + 0xef5ba1687dfc84b5, + 0x5621f7ea9bfea523, + 0x387b9d4dc9e1b28f, + 0x6f3a4c9ed7e4c1fb, + 0x49c7fd3217e6df59, + 0xa41ce8d324d8fec5, + 0x63bae8c876fc1e43, + 0xb74d15f763de2c9f, + 0x3562e1ba92f35b1d, + 0x9564b2cbafe45b79, + 0xe532864cbcd879e5, + 0x8b3a9611fbeca963, + 0x4b85da6218cd96bf, + 0xdb8ac52549e1c63d, + 0x14ba28f657d3e4a9, + 0xad132b7a96d8f417, + 0x25d749cba6eb1483, + 0xd2c64e3a94cb32df, + 0x7f1c6d4cb2cf415d, + 0x3829eb4edec25fb9, + 0x2b769a421fc58e27, + 0xcf79ab632ec78d93, + 0x6e41852437b98aef, + 0x7f95bde5479eba6d, + 0xa21c9fd876b1e8d9, + 0xd8e2931cb6c3f947, + 0x347c561fe5d718b3, + 0x359bd8a1f5db4831, + 0xaf386dc212bc358d, + 0xb98a15f431be54f9, + 0x18a9bec65fc29367, + 0x5e1d3fb87eb692d3, + 0x76325dc98dc9b251, + 0xd6c5782cb678af9d, + 0x42e8fdbba68dce1b, + 0xa391472fe5a1fd87, + 0xa8b47ed327a51ce3, + 0x8c5eda3545b83c61, + 0x2c73e18652a839bd, + 0x439ed86871ad593b, + 0x19382ab76e9f58a7, + 0xb98a651dceb3a815, + 0x41a9d68feda5b681, + 0xe6b38751f987a4ed, + 0xef4ba282198ad35b, + 0x78b1f6d4368de2c7, + 0x62f31ac989b41235, + 0x2f1ac5da97b642a1, + 0x46c8fa3a92863efd, + 0x8e41392dc1894e6b, + 0x537261dbaf6b5cd7, + 0xcd12f35fed7f8c45, + 0x1d47fec32e739ab1, + 0x62eb48f43c75b92f, + 0x4a6571843a56d78b, + 0xb71c8695485ad6f7, + 0x1e52b73ba48df675, + 0x9fb42d7dc79236d1, + 0x765b213ed296354f, + 0x392bac71f18753ab, + 0xa7c3e9f5418b7329, + 0x58647ce43f6d8195, + 0xc7f5d3a54b5d8fe1, + 0x946bfe587b62ad5f, + 0xb8d95f687854adcb, + 0x76f2e41cb857ec39, + 0xf4b1e3ced649fba5, + 0x9763b4d1f67e2b13, + 0xc39b7ef32561397f, + 0xd9c8e626526347eb, + 0xbe876fdba1486759, + 0xf69213487f3a86c5, + 0xd4217a8a9e5da643, + 0x1d3c64a98b4ea39f, + 0xf3685d1fea64c31d, + 0x9b8d4121fa45e179, + 0x8a4ce6f21837efd5, + 0x1e73bd85486b1f53, + 0x7c3bd597654c2daf, + 0xc837edaa94615c2d, + 0x98aedf5cb1435c89, + 0x61a8297cbe267af5, + 0x51823a4ede2b9a73, + 0xc9ad128fea2b97cf, + 0xca3b54621a2fb74d, + 0x2dcabf654a32e5b9, + 0xc21e73498a36f527, + 0x821c473cb84a1593, + 0xd581bc4a964a23ef, + 0xfa3dce6cb53e426d, + 0xf94a5d6fe34261d9, + 0x43b287fede148f37, + 0x9c1b56732f168ea3, + 0x72bfae665e39ad21, + 0x85e93b65491cab7d, + 0xc98eab36571fcae9, + 0x346c7adcb912fa57, + 0x8145632ed82619c3, + 0x5b97d1cfe72a3941, + 0xb843d651f41b369d, + 0x91f56a74342e561b, + 0x249b1fc763219487, + 0x8e45d1776df294e3, + 0xc9a172398df7b361, + 0xc541dae769f7a1bd, + 0xc4716af987e9cf2b, + 0x4c6358bba5fcde97, + 0xd264e91dc7e21df3, + 0x5dceb4f328f53d71, + 0xf9ce8d3324f63acd, + 0xd1fa492762f95a4b, + 0x8a14395761fd59b7, + 0x8f692ea87edf8925, + 0xe57b6f8bade3b791, + 0x96fa32dcb9c4a5fd, + 0xe7a62591f9e8d46b, + 0x3597b8c218cae3d7, + 0xde2418a438cdf245, + 0x54fc962878e243b1, + 0x3ab24cfa97d6512f, + 0xfd431eca92d64f7b, + 0x4b6d157ba1c95de7, + 0xcbed312bafbc8d65, + 0x9c163f2fedaf8bc1, + 0x4fd7a3521dc2ba3f, + 0xe69134832ac4d89b, + 0x1c28abe54ac7e819, + 0x259fc68546cbf785, + 0x82b7cf5a96bd27e1, + 0x1af2e79cb7c1365f, + 0xcda357ffe2d354cb, + 0xb264e931f1d87439, + 0xe1897a4431db82a5, + 0x3267a4c65fbda213, + 0x957e1cb43b8d9e6f, + 0x16e4d8a65982aedb, + 0xd4c23b6878a5ed49, + 0xb15d4e9ba697fcb5, + 0xa7c24f9fe7ab1c23, + 0xac9542ffe49d2a8f, + 0x4dc3a6e325a148fb, + 0x26f17db542c35869, + 0xd73e128541b687d5, + 0xad5f27b76f9ba753, + 0x57f192d76d7c94af, + 0xe6f732da9a8fb42d, + 0xc2a38f4edba3e289, + 0x8ef46c5ed896e1f5, + 0x1f593d8549ba2173, + 0x457fe69435792ebf, + 0xc28adf47658c4e3d, + 0xe583642873815da9, + 0xe296357cb2a48c17, + 0xed513f4dcf769b83, + 0xcdf4a52cbc5798df, + 0x46a91c71fa6cb85d, + 0x268cb3721a5fd6c9, + 0xfdc752b54b92f637, + 0x1a4cfd865b9716a3, + 0xac24381cb89a4621, + 0x9f2c61bba58b437d, + 0x5834edccb37d52e9, + 0xfdc4635fe3a29157, + 0x9c5173fede648fb3, + 0xb9af75832f67ae31, + 0x74f61dc32e47ac8d, + 0x8561b244384acbf9, + 0x92ab3cf6594feb67, + 0xdec5a71cb9741ad3, + 0xc46e581ed9873a51, + 0xaf63d7cfe45837ad, + 0xb152a961f36c572b, + 0xea564822124e6597, + 0x28bcfa37627195f3, + 0xa672e4d98f65b471, + 0x85d4fb287e46a2cd, + 0xcadf41698c59d14b, + 0xd56a137a983bdfa7, + 0xd29853ccb84dfe15, + 0xbd5e3791f9643e81, + 0xde8bf3a217453bed, + 0xb8ae6f7326384c5b, + 0x27b1a537623b5ac7, + 0x2f8547ca914e8a35, + 0x3c12f76a9f42b8a1, + 0x2ce4531bad34b71f, + 0x47b12dffec26d57b, + 0x9a5c18d1fa29d4e7, + 0x8657fde21a2cf365, + 0xf8e7a237695f24c1, + 0x2cba5f798964523f, + 0xb4d1e97ba736519b, + 0x9b3dfe2ba3285ef7, + 0xb6e4f75dc12b8e75, + 0xfe2d967baf2e8cd1, + 0x65a8c49fed21ab4f, + 0xf4a615b32e13d9ab, + 0x3ae169d54c16ea29, + 0x5f9db3c54b1af895, + 0x426319a8793c28f1, + 0x6312ecdba81e276f, + 0x7e2dba4dc71245db, + 0x4821f73fe3167549, + 0xba862391f21983b5, + 0xaf192877651ca423, + 0x41b7a8643deca18f, + 0x16a5dc2438cd9feb, + 0xf91b38476af2de59, + 0x2b4e6fc878e4fdc5, + 0x91d48c3cb8f91d43, + 0xf4d8159dc5ea2b9f, + 0x815ab4fdc5fe4a1d, + 0x849e51d324f15a79, + 0x9e18357542f378e5, + 0x2b9e7f3651f7a863, + 0xdf56e7854ed895bf, + 0xbc135ef87aecb53d, + 0x8c3f192878cfd3a9, + 0x63197abdcad4f317, + 0x95e1ab71fae71283, + 0x1c8f7b4327c831df, + 0x6cba35d326ca3f4d, + 0x4bde13a653cd4eb9, + 0x13657bca94e18d27, + 0x64eb387ba1e48c93, + 0x36ea9cb87db589ef, + 0x9f61c45baec8b96d, + 0x4867c5b1f8abc7d9, + 0x86f3dbc21abfe847, + 0xcf748db65ad417b3, + 0x935bd7a76ad84731, + 0x125ce4a876c9348d, + 0xcd1fab6984cb53f9, + 0x12fe86dcb3ce8267, + 0xc8d7a21fe4c291d3, + 0xb6f831cedeb5af41, + 0x69ca5e421f85ae9d, + 0x17fd62843e98cd1b, + 0x7cd8e4643a9bec87, + 0x1ca6e296578dfae3, + 0xfe82639ba9c43b61, + 0xe3496addc6a538bd, + 0x392fb56fe4c9583b, + 0x91ec42b1f2bc56a7, + 0x58b43df323be9715, + 0xd8c3e45763c2b581, + 0x9e1f8ab65f84a3ed, + 0xe8472c976e97d25b, + 0xe58b9d476b89e1c7, + 0x3718d64ba98bef25, + 0x58fda17dc78e2f91, + 0x4a1cf75fe6823cfd, + 0xde8cb94217954d6b, + 0x6d3af41323985bd7, + 0xa8c1bd47629c8b45, + 0x8a1bd757627e89b1, + 0xbac5fd4a9e71b82f, + 0x7e4316cbae73d68b, + 0x6be923fdcb86d5f7, + 0x75b128dfeb8af475, + 0x26c89b543a8c25d1, + 0xe97b1c36598e234f, + 0x58e9fd47678352ab, + 0x1482a3ccb5a67129, + 0x62e1385cb2697f85, + 0x95cfa76cb26a8de1, + 0x8c4e69dbae4d9c5f, + 0xe543a721fe51dacb, + 0x963ab8421d64eb39, + 0xda594c832c46f9a5, + 0x1a23d8c76c7b2a13, + 0xbd74f1e7695c287f, + 0xc472aefa975f36eb, + 0x38e5cb7ed4827659, + 0x6d8a95ffe27684c5, + 0xa564e7d1f179a543, + 0xdaf78214315ba29f, + 0x15627dc54f5eb21d, + 0xf41dae665c41df69, + 0x1385ce687a43fed5, + 0xb7c3129bab681e53, + 0xa139edfcb7482caf, + 0x26d7193fe75c4b2d, + 0x7d94c35fe53f4b89, + 0xc34f2762164279f5, + 0x193e4c276245a973, + 0xc6ad23b6513796cf, + 0xc8ad19487f2ab64d, + 0xa92681f87c2ed4b9, + 0xa7c4e38cbc51f427, + 0x687d4bffec561493, + 0xab16f95ed94732ef, + 0x5e8ac7b3293a416d, + 0x6ed2f944362b4fc9, + 0xacd45be9852f6e37, + 0xcea465ba95428da3, + 0xe5263a9cb346ac21, + 0x271f48ca9f16ba7d, + 0xc67d58acbd1ac8e9, + 0x8729c531fb1de957, + 0xd1f786365d4218c3, + 0x5fbd18a87c263841, + 0x9f435c776a17359d, + 0x4a7d6c5a982a651b, + 0x21845dfcb51d6387, + 0xda4f168cb51f82e3, + 0x8fb7324fe534b261, + 0x7198da3cbce39fad, + 0x63f2e8a21df6ce2b, + 0x4f6b85e32bf8ed97, + 0xb7a93de548daebf3, + 0x87fade1769ef2c71, + 0xb2a9c56987f239cd, + 0xaf13e9bdc7f6594b, + 0x7ef61caed3f958b7, + 0x5478fd9fe3fc9825, + 0x54abd37323fea691, + 0x8fd9264652e1a4fd, + 0x1c82be965fe4d36b, + 0xbfce31265bc6e2d7, + 0x3b71d2c98bdaf145, + 0x2be376dba9ed32b1, + 0x32e6458ba7bd3e1f, + 0x4d38a7c1f6d24e7b, + 0x5b7c293216d45ce7, + 0x4f9e7da323e98c65, + 0x2f8e1cb653eb8ac1, + 0xfb97523761cda93f, + 0xc5f1b9e76fc1d79b, + 0xb4e2c36badc4e719, + 0xc471fa6edbc7f685, + 0x4673e2a1f9ca26e1, + 0xf4c7d29219bc245f, + 0x7a31968327af43cb, + 0x7ab4293768d47239, + 0xd8431a6a94d681a5, + 0xa8db625a93b78ef1, + 0x2bc451f981ba9d6f, + 0xf29a7c398f7e9cdb, + 0x8e31b2a1fda1ec49, + 0x7a8c34521d93fab5, + 0xe8a196765dc81b23, + 0x61f38eb547ba298f, + 0xfd643e16569c37fb, + 0xf71238eba5bf4769, + 0x5d8e741dc4b286d5, + 0x49c8db1fe2c7a653, + 0x2b4cd36fe1b793af, + 0xb83162c5419ab32d, + 0xefad12643f7ed189, + 0x18cf39754b81dfe5, + 0xfe6934798ca51f63, + 0x2e5a8b6879862dbf, + 0xa7d5e48cb7894c3d, + 0xdabfc48fe57d4ca9, + 0x439d7c1fe49f6b17, + 0x7456bda215b29a83, + 0x8ced42f4328497df, + 0x67fd2a854198b75d, + 0x1da2cb954f6ad5c9, + 0xbed25a6a9c8de537, + 0x175a29edcd9215a3, + 0xdb2a351feca74521, + 0x19e38a21fa98427d, + 0x963e7a13287a51e9, + 0x4dae19b3258c6f47, + 0xd9f718e6546f7eb3, + 0x3a4c21da9584ad31, + 0xdbf451ca9164ab8d, + 0x91c7f2e98e46caf9, + 0x31b875ddcd4bea67, + 0xa1c984bfea5cf8d3, + 0xbf57ec254d823951, + 0x5bd7e3a32b7436ad, + 0x5fe732b54a78562b, + 0x1ed67fcba85b6497, + 0xd2be486ba56c84f3, + 0x5b28fe7dc46fa371, + 0x8f4b72cfe263a1cd, + 0x547e9bfede45cf3b, + 0x8dfa74621f36dea7, + 0x6519ab743c4afd15, + 0xed3c71b76b5e2d81, + 0x8fda539879513aed, + 0xefdb7a8dc9634a5b, + 0xc4319b7ed83659c7, + 0x16b793ffe64b8935, + 0xa3627191f34d97a1, + 0xd865fb73234ea61f, + 0x48b5ea376152d47b, + 0x2bae4d376f25d3e7, + 0x465b9e298d39f265, + 0x7b243e5a9d5b23c1, + 0x46e891ccba5d413f, + 0x269ce1aed9314f8b, + 0x3f1cb76fe8235df7, + 0xf4523d9219268d75, + 0xbd71e65545398bd1, + 0x895cda27632c9a4f, + 0x72bde347612fc8ab, + 0x75c924fbaf13e829, + 0x862ec45cbd14f795, + 0xc267fb3edc3927f1, + 0xf734c9dfea1b256f, + 0xf18bc973291e34db, + 0x31985ba76b217349, + 0xe3184b58791482b5, + 0xed68925cb748a123, + 0x3789d2cba3189e7f, + 0xdc1ab3f9821a9deb, + 0x65ab72f98bfecd59, + 0xc23e847edae1fbc5, + 0xf6c957832df61c43, + 0x9f1b2ce43be62a9f, + 0xcdb497f658fa491d, + 0x82b1ea4656fd4879, + 0xce78f3aa94df67e5, + 0xa8247d1dc5f2a763, + 0x7df1a6bdc2e594bf, + 0x5917c82fe1f8b43d, + 0x1b9254d431fbd2a9, + 0x86d12b954fcde217, + 0xa9fc85d87de42183, + 0x18abd2e769b42ecf, + 0x4ceb57a989c73e4d, + 0x318cde6ba6e84db9, + 0xfd42573cb5ed6c27, + 0x3bf4279fe4df7b93, + 0xca43d65214c298ef, + 0xd15a849432e4b86d, + 0xd76b823541e7c6d9, + 0x7dc316a65fcbe647, + 0xce96dab87cadf5b3, + 0x69e3f7acbcd24631, + 0x19f5c78feac5438d, + 0xaf2d854fe8c752f9, + 0x64315da329db8167, + 0xc95a136325ab7fc3, + 0xe14cf93765bf9e41, + 0x4cfba7e763b2ac9d, + 0x714eba9982a5dc1b, + 0x4bce6a2a9fa6eb87, + 0x7fd16e8cbc8af9e3, + 0xb4195721fcbe2a61, + 0x8a7495332ca137bd, + 0x1e549d832ac4573b, + 0x8c7a6ef439c865a7, + 0xf61d3c2987cb9615, + 0x3d248a5a95bda481, + 0x8c9de62ba38f92ed, + 0x79a1f8bfe2a3d15b, + 0xdfa2be5dce84dfb7, + 0xe926bcf21d98fe25, + 0xef816d754d8b2e91, + 0x127f3ac5497c2bfd, + 0xcf4e39b87a914c6b, + 0xc64e187cb8935ad7, + 0x52f97c4ed6b78a45, + 0xd73a6c1fe47a98b1, + 0xc8bd426fe38ca72f, + 0x38ec6542127fc58b, + 0xda1b82365192d4f7, + 0x812f9c654e96f375, + 0xa32c58987e8924d1, + 0x2af468da9c8b324f, + 0xb274f3edc97e41ab, + 0x9feba26eda826f19, + 0xdeb29451f6937e85, + 0x7c3ba19325768ce1, + 0x98d5f76323689b5f, + 0xf73da9b5425da9cb, + 0x3562d8a8716fda39, + 0xc78d6fba9e62f8a5, + 0x842563edce872913, + 0xfa513b8edc59267f, + 0x7d43ae51f96a35eb, + 0x23ba5d621b7e6459, + 0x6dca9b854a7183c5, + 0x8325f6187986a243, + 0x2af51e798456a19f, + 0xc7269b4982479efb, + 0x9174c32ba14bce69, + 0x4f75d18a9b3fecd5, + 0x36bdc2a1fe741d53, + 0x93cf4ed21d452baf, + 0x76a412543c584a2d, + 0x6fae48365b3c4a89, + 0x548d9f18793d68f5, + 0xf36e4d8dc951a873, + 0x76c4581cb64395cf, + 0x91cf52afe237b54d, + 0xce2b4811f148d3b9, + 0x6bc21d95415ce327, + 0x4763a2b65d4ef193, + 0x9cf412e87c5431ef, + 0x2e75ab398b263f5d, + 0xa3fdc4b98a274ec9, + 0x16eab48dc92b6d37, + 0x293cb58ed62e7ca3, + 0x38479db1f753ab21, + 0xcbd628e21523b97d, + 0xbd98c1654325c7e9, + 0xbfae8347612ae857, + 0xa8ce4d687e1bf6c3, + 0x3874fdebad3f2741, + 0x8ed4f23cbc12349d, + 0x476bd83fec27641b, + 0x76c592d1fb1a6287, + 0xf5b98ae5492b81e3, + 0x39f57c15472d9f51, + 0x3be5a1c765219ead, + 0xbe62ac398514cd2b, + 0xc7fe568ba215ec97, + 0x73c415f98cd7eaf3, + 0xb7d5f36badfc2b71, + 0x218fe69cb9fe28cd, + 0xcf8645a32cf1584b, + 0x6c93fe432af356b7, + 0xced527154af89725, + 0x8cd35b6876fba591, + 0x31abc94874eb93fd, + 0x7ea6314a93efc26b, + 0x546c9a1cb2f3e1d7, + 0xfd5814acbdc6ef35, + 0x165c82b43ed82fa1, + 0xb6af3e854bca3d1f, + 0x3a9edb8549ce3d7b, + 0xc4d87ef769d15be7, + 0xe674dc2ba9e38b65, + 0xc9f384acb5e689c1, + 0xa697bf1dc4d9a83f, + 0xcad5be91f2edc69b, + 0x8f5a9ce323cfd619, + 0x52ab3dc761d2f485, + 0xaeb572476fc725e1, + 0x851bc4987dc9235f, + 0xa421e68879da42cb, + 0x5dca219cbace6139, + 0xb12c493ed8c17f95, + 0x14c72dafe6b48df1, + 0x7e82fb4214b59c6f, + 0x58ad639323c79adb, + 0x8e1739b652acdb49, + 0x51f4bc3761afe9b5, + 0x2decbf3a9fc51a23, + 0xf981b53badb5278f, + 0x9f65b32edca836fb, + 0x4d6b38e1fabc4569, + 0xc38bef5219ae74d5, + 0xc94d7af769c1a453, + 0x29bc8d4656b492af, + 0xbc1fe59985a7b12d, + 0xd5fb9a1762a8cf79, + 0x1fd3587a918acde5, + 0x2ed7483bac8efd63, + 0x193f5c7fed832cbf, + 0xc9e28a721e964b3d, + 0xb31a7e932d874ba9, + 0x36719af54b9c6a17, + 0xc64a218656ae7983, + 0x8947dc3ba58196df, + 0x457f38bdc493b65d, + 0x91a26c7fe286d4c9, + 0xa5b91c61f19ae437, + 0xf15697b5418cf2a3, + 0xc32d8b476e9f3421, + 0x8bdc4fe76e93417d, + 0x94bc72e76b754fd9, + 0x4978b25bab896e47, + 0x27b1934dc86a7db3, + 0x3c7e5f2ed67e9c31, + 0x83e2acb1f461ba8d, + 0x4dbae6921463c8f9, + 0xf5c7b6d43285e967, + 0xdf82ab365169f7d3, + 0x8fdc315a9f7d2851, + 0x5bcf6d398c6f25ad, + 0x4316ba7dcd83652b, + 0xa853c62fec856397, + 0x4ac672ffea6982f3, + 0x41defb74396ca271, + 0xcf743b13254c8fbd, + 0x895c1a287561ce3b, + 0xe6b9c3198253eda7, + 0x8472fb1ba267fc15, + 0x2e97d4ccbf5a2c81, + 0x4627c9ebac4b29ed, + 0x6952fa3fec4f395b, + 0xc8695bd21d4258c7, + 0xe67b81f32c469835, + 0x218476c65b4896a1, + 0xfbc463d9874ba51f, + 0xadbe723a954ec37b, + 0x3a2596dcb451d2e7, + 0x49a3b1ced274f165, + 0x83625c1fef5832c1, + 0x78bcf3521d493e2f, + 0x85daefb54d2c3e8b, + 0x6e4afc165a2e4cf7, + 0x1d8e6f5a9b328c75, + 0x7f41ed9cb9358ad1, + 0x19e37d6dc627a94f, + 0x2f75c81fe429c7ab, + 0x968ad2b1f43ed729, + 0x8d9ac7132431f695, + 0xeba47269834526f1, + 0x4298fc587e18246f, + 0x9acf3d687e1943db, + 0x25d617ebac1d6249, + 0xe2f64b1dca2f71b5, + 0x81e976aeda249f13, + 0x25c8ab6fe6149d7f, + 0xd6fab85325169ceb, + 0x8b4152c4341adc59, + 0x5ca4e8d7631deac5, + 0xd38f71eba6521b43, + 0xd82a69487de3289f, + 0x81e94c7bacf6481d, + 0xe4bc187edcfa4679, + 0x4c372e8ed9fb76e5, + 0xf5267b421afe9563, + 0xe586dca547e193bf, + 0x1b3d4ea767f5b23d, + 0x16c4e58874f6d1a9, + 0x8cd943a872d8cef5, + 0xc7a843fa91dbfe73, + 0xc52a46f98bae1dcf, + 0xeb516981fbe23c4d, + 0xd94bfac21de54cb9, + 0xdfe928743ce96b27, + 0x39278d6548ec7a93, + 0x3fbe9c1545bc87ef, + 0x67dce2fa95e1b76d, + 0x5829e7bba4e3c5d9, + 0x87d41a3dc2d8e547, + 0x48236c1fe1d9f4b3, + 0x38d491e764ed2531, + 0xd3b98c754ebf328d, + 0x458b7d376dc351f9, + 0x56e9cfa98bc46f57, + 0x9d3c128769b87ec3, + 0x652de97ba7cb9d41, + 0x974d68fdc4ae8b9d, + 0x14b25781f5c2da1b, + 0xc523be4214c3ea87, + 0xf79cd2b542b6f8e3, + 0xdc92ae3873db2961, + 0x2eb786c65f9c26bd, + 0xf1a65b798daf463b, + 0x7d352f4cbdc264a7, + 0xf7a4592febc79415, + 0xd96a3411f7c9a381, + 0x859da613268a91ed, + 0xab614373258daf4b, + 0x326fbdc65491deb7, + 0x5de74bf983a4fd25, + 0xb96cd1eba3b72d91, + 0x23d184ba9e782afd, + 0x685241fdce8d3a6b, + 0x5da36c4feb8f49d7, + 0x6df849a21db28945, + 0xb1cafd743ca597b1, + 0x89e5a1d54798a62f, + 0xc5ea9837657ac48b, + 0x851ecd4a948dc3f7, + 0x17d8af2dc4a1f275, + 0xd842fa5fe4a623d1, + 0x6139a27ede98314f, + 0x635b2ca21e683f9b, + 0x691478f43d7c5e19, + 0xd69b21f43b7f6d85, + 0x52ec1f476a738be1, + 0xafd576ccb8749a5f, + 0xe47a3bfed456a8cb, + 0xdf5c193fe46bd839, + 0xdbe481a1f26de7a5, + 0x8a13f46656a42813, + 0xc3fe7d576194257f, + 0x34fac2965f6734eb, + 0x56e9da298e7b6359, + 0x83b21d6a9b6d72c5, + 0xd42879bdcb7f9143, + 0xe7d613adc7529e8f, + 0x789f2b4fe6549dfb, + 0xacb97ed21547cd69, + 0xa65c87f32349ebd5, + 0x6e5fd1a8726dfb53, + 0xa9c17259836129af, + 0xc7298bfbaf65492d, + 0x89f5371dce364789, + 0x68a5473edc3a67f5, + 0x5b12cde1fb4d9673, + 0x2589f762193e84cf, + 0xd7ec13865962b34d, + 0xf8b94e376745d2b9, + 0x1c5f9d7ba659e127, + 0x17d4aeca924aef83, + 0x6cde345a924b1edf, + 0x56a2347cbf413e5d, + 0x9b456ea1fe234dc9, + 0x7948cba21e286c37, + 0xdabc2f154d297ba3, + 0x8ba51ed76b4d9a21, + 0x7f892e46562fa87d, + 0xcf4596eba732c6e9, + 0xfa1be93dc824e657, + 0x175ef82ed428f5c3, + 0x8931c2b1f35c2641, + 0x12a3cdb6514e239d, + 0x3841f2a87f42631b, + 0x6afb7c2a9e246187, + 0x4153fac98b167fd3, + 0xda762eb98b2a9e51, + 0x8631da4a961b8cad, + 0x4fb185ced61fac2b, + 0xc123db71f512eb97, + 0x4fbad9632615e9f3, + 0xfd132a9765392a71, + 0xe1c7b597631a27cd, + 0x2bcfd3176efd374b, + 0xec61f7b98cef45b7, + 0x6247edfcbcf39625, + 0x31a5869edbf6a491, + 0xe64b1fddc6e792fd, + 0xc1d86a4327fac16b, + 0xf49c7ae324edbfc7, + 0x263afcb876d1fe35, + 0x935e7b2984f52ea1, + 0x3c7ab8ea92e73c1f, + 0x4e6ca7398fe93c7b, + 0x2bd41aca9bdc4ae7, + 0xf73a4c6febdf7a65, + 0x17d5e9a32be398c1, + 0xb8f739e329d5a73f, + 0x4b98c76436e7c59b, + 0x481ad5e876ebd519, + 0x23d5ab1a94cde385, + 0x459d61ecb6d324e1, + 0xa5d879bdc1d6325f, + 0x714563dfefd741cb, + 0xfd5978621eca5f29, + 0xc453a6832dbc6e95, + 0xedf2b9c549ae7cf1, + 0x1ed3caf658c29b6f, + 0x2ca8e96876c4a9db, + 0x5dc186ecb5c7da49, + 0x529f6baed3cae8b5, + 0xc9862a7fe4bdf823, + 0x75b9fe1434c1268f, + 0x2e4d371761c435fb, + 0xa9e615243fc85469, + 0x23fbde176eba73d5, + 0x3471bdc98cbd9253, + 0xd342a67cb79e81af, + 0x8a67b23dc793af1d, + 0x57cde461f5a4ce79, + 0xfe8d25921497dce5, + 0x469b75e3249afc63, + 0x8ec31df6538d1abf, + 0x65c1e9d982b14a3d, + 0xc34be8a87fb348a9, + 0xe28465bdceb86917, + 0x7b82c14fedab9783, + 0x1432d79fe97b85df, + 0x9f867cb2198fa45d, + 0xa6bfe3c54782d3c9, + 0xde17b3a658a6e237, + 0x914a53c87598f1a3, + 0xd49a5f6cb6ac4321, + 0x376b512ba18c2f6d, + 0xa2d78c5cbf714ed9, + 0x97836d11fe936d47, + 0x3b62a4e21e867cb3, + 0xef965d154d7a9b31, + 0x6e852b14375ca98d, + 0x18b26f95465eb7f9, + 0x31e9cf4cb592e867, + 0x65da91ecb485f6d3, + 0xf38d916fe49a2751, + 0x1c8d72a1f17b24ad, + 0xcdb9ea74318e542b, + 0x259ba7c54f816297, + 0x29f1c5776d7581f3, + 0xde47c9a98c579f61, + 0x2d184fb769478ebd, + 0xb4ad5c3a975cad3b, + 0x5186c4acb54fdca7, + 0x382649afe673fb15, + 0xfae154b435762b81, + 0x369187c5435728ed, + 0xcfeb2188716c385b, + 0xb7fe26498f3e46c7, + 0x3c71f85cbe619735, + 0x952347edcd6495a1, + 0x81a7c6eedb57a41f, + 0x5e3d6a41f849c27b, + 0x9f1d48c3284bc1e7, + 0xf597ce63273edf45, + 0x94b3dae987642fb1, + 0x84aefd2a94563d2f, + 0xb539c2dba1473d8b, + 0xcae826fa9e2a4bf7, + 0x6b57da4dcd2e6b75, + 0xa54c96e1fc4289d1, + 0xc5b432621c23a84f, + 0x4cde12743925c6ab, + 0x1c389266583ad629, + 0xcb512369872ce495, + 0xd34cbe8a963de4f1, + 0x9b6f238dc754236f, + 0xb7234adfe13642db, + 0x58f3297fef2a6149, + 0x86f75b132e1b6fa5, + 0x1ae94d365c2d8e13, + 0x81dace365b219c7f, + 0x8bc53da768139aeb, + 0xd5e13b9ba816db59, + 0x13c62aecb618e9c5, + 0x6f2713bed61cf943, + 0x192e453ed42e179f, + 0x367bc1865623471d, + 0xb14e92c982164579, + 0xba1c64d43df874e5, + 0xb4ced1587dfb9463, + 0xd485129769ec82bf, + 0x13bfd57a98efa13d, + 0x4fe8759cb6e2cf89, + 0xdca5f34cb6e4cdf5, + 0xe6bd53f215e8fd73, + 0xef5c6a7434e91bcf, + 0x3deab25763fe2b4d, + 0x4b91afd872f14ab9, + 0x16d254aa9fe46a27, + 0x79ec542cbde67893, + 0x1f47936cbac986ef, + 0x6ab98e11f8eca56d, + 0xfbce978217cfb4d9, + 0x89721b3659d2e347, + 0xcd6b879657d6f2b3, + 0xecd3b76a97ea2431, + 0xd5b31cfa94eb318d, + 0x4637da1981bc3fe9, + 0x96f1a34cbfc16e57, + 0x6da5e891feb47dc3, + 0xdf38e5632ed79c41, + 0x937fe6432bc78a9d, + 0xf32bc6e547adc91b, + 0x63c9be7545bfd987, + 0xa6e3215a96b2f7e3, + 0xd65ae82dc5d72861, + 0x698a14cfe3c825bd, + 0x24cae8b1f1dc453b, + 0x8d69b7e321ce53a7, + 0x8ce7bfa76fc29315, + 0xad1b9c776ec5a281, + 0xb936fca54a958fcd, + 0xf75ca4e76798ae4b, + 0x341e28aa958acdb7, + 0x7d4e5f6cb69fec25, + 0xc3ea65b1f6b42c91, + 0xf54e9d7214a529fd, + 0x138d9b2542c8396b, + 0xfeb8c61651ab48d7, + 0x7328eab76fae7845, + 0x31a6d5e98ea296b1, + 0x973e845cbc94a52f, + 0xc79a845fea96c38b, + 0xfab2319fe689c2f7, + 0x4e16bc73289ce175, + 0x5bacf144357defc1, + 0xf12e43c876942e3f, + 0xcf583ba872853e9b, + 0xfe8d152cb2a85d19, + 0xb7c412fbaf7b6c85, + 0x271c49dcbc6d7ae1, + 0x4c63db8fec71a95f, + 0x528ed7621d63a7cb, + 0xc86b49332b86d739, + 0x4f1c76a43879e6a5, + 0x423f57ba978cf613, + 0xb86135cba58e147f, + 0x914afe8dc58243eb, + 0xa8271d3fe1a76259, + 0x8729d6afef6971c5, + 0x54b72cf21e6b8f23, + 0xbf59c1332b4c7d8f, + 0x8127ce354a519cfb, + 0xde9c5af87a53dc69, + 0x41e6b28a9846ead5, + 0x74268f9dc769fa53, + 0x38e6c25ed45c18af, + 0xd72b8c5fe46f382d, + 0x2cea38b213724689, + 0x615cb784318476f5, + 0xd85c17a76f4a9573, + 0x8e7b29376d4a83cf, + 0xa132c7f98b5ea24d, + 0x36a7b4edca52d1b9, + 0x57e314adc954df17, + 0xf918a45ed746fe83, + 0x1d8347c326481cdf, + 0xba47dc24364b2c5d, + 0xfd92ce37624f3bc9, + 0x1d576fbba1526b37, + 0x8cfd927cbf2579a3, + 0xe9ba675dce48a921, + 0x13576cffec2ba67d, + 0x873ce491f82db5e9, + 0x1ef674932b31e457, + 0xd37548e76925f4c3, + 0x3e2f1a998a692541, + 0x3e67c1f9864a329d, + 0x9be12f4ba64d521b, + 0x527489ecb12e4f67, + 0xea17296cbf127ed3, + 0x75bcde61fe269d51, + 0x63f194a32e168bad, + 0xef658a954d19ca2b, + 0xebf61275481eda97, + 0xd1bf65387921e8f3, + 0x7d19b52dca352971, + 0x29d36afcb51726cd, + 0x189cd64fe51a364b, + 0xb982e5a1f21d54b7, + 0x1d8b3457631f8425, + 0xd8f36ab65ef2a391, + 0xfce963d65be491fd, + 0x9a5861e549e6af5b, + 0xca2be43656f8bec7, + 0xa7c24f1a97fbed35, + 0xe7f435aa95defca1, + 0xfba2c41ed6e43b1f, + 0x56ac48e214f53a7b, + 0xdb96eac432f849e7, + 0x96ad8fe541fc7965, + 0xc4937eb65fde87c1, + 0xe52fb7198cd1a63f, + 0xfe6a57298ae3c49b, + 0xa5349fbdcae7d419, + 0x378d4ac1f7dae285, + 0xe526d87437cbf2e1, + 0x2f9d7ec547ce215f, + 0x8c3549a765d23fab, + 0x2a4b761983d65e29, + 0x6941fe5ba1e86d95, + 0xfeac13998eca7bf1, + 0x41d72c6a9cbd8a6f, + 0x13cd2841f9c1a8db, + 0x4f9eb6521bc3d849, + 0x3ae7f69329c6e7b5, + 0x1d3798e658caf723, + 0x1d498ce876bc158f, + 0x9a6cfe3985ae24fb, + 0xf1574e9dc4d25369, + 0xf47b52afe1c672d5, + 0x1524ca6fefca9153, + 0x65df2e321d8a7e9f, + 0x42d6acf43b8c9e1d, + 0x27c813d54ba1cd79, + 0x5a783c476893dbe5, + 0x6e2d538a98a7fb63, + 0x7f86ea5dc5a819bf, + 0xd3c4fb1fe5ac293d, + 0x5934cf6fe2bf37a9, + 0x8e6b73a324c36817, + 0x8ce61d5541c59683, + 0xf187a9c43e9784df, + 0x812fb7476e8ba35d, + 0x937eda476a7eb2c9, + 0xde92b31dcba2e137, + 0x87e2fdadc784ef93, + 0xe13486adc5861def, + 0x863da7c215892e6d, + 0xe36894f3247b3cd9, + 0x1cf784e7629f5c47, + 0xf95b246981927ab3, + 0x693e17acbf869a31, + 0x5c6891acbe56a78d, + 0x571a846edc5ab6f9, + 0xa5d34611fa8ed567, + 0xc85afd132a81f5d3, + 0xa1657e354ba72651, + 0x3e9f1a26568723ad, + 0x4c2aebda968a532b, + 0xa9658d1cb38d5197, + 0x18dbe32ba17d6fe3, + 0xd3fa927dcf739e61, + 0x94e83a71fe548cbd, + 0x8ae9b5f21e57ac3b, + 0xfce6d4132c49dba7, + 0xdf81b235496dea15, + 0x6dbc854a9b732a81, + 0xfe52c74ba86427ed, + 0xf2ba465ed468375b, + 0x7264ad9fe26a45c7, + 0xe35d1cb1f17d8635, + 0x7a12de44326f84a1, + 0xf69d21465e64a31f, + 0x25ab97d76e45c17b, + 0xe37f9a865a36bfd7, + 0x91fc4e59893ade45, + 0xde8b721a974cfdb1, + 0x9c42a17ed8613c2f, + 0x35d76ec1f6543c8b, + 0x582f7e3215364af7, + 0x368bd255423b6a75, + 0x12ac78b7624c78d1, + 0x3fc1b5876d2e974f, + 0x97d5fc498e32c5ab, + 0x185f7d3cbc36d529, + 0x5e81b62edb28e395, + 0xca87ef2ed84ae3f1, + 0x469fc514394d126f, + 0x5f798347685241db, + 0x12bf5d3987245f39, + 0x145edfba93276ea5, + 0x641289dcb24a8d13, + 0xa8e371ca9e1c8b7f, + 0x9c14f2ebac1f89eb, + 0x41c37261fc12da59, + 0xa53cef432b14e8c5, + 0xef2b93d65b19f843, + 0xc87de396582b169f, + 0x46dc1b5a982e361d, + 0xd1467fadc8215479, + 0x5629834dc61473e5, + 0x51c4fdbfe4189263, + 0x74de86fdcde781bf, + 0xe4f97ac21cea9f2d, + 0x3d58b1f32afdbe89, + 0x9371dfc549e1dcf5, + 0x9ab5fd1769e4fc73, + 0x465f279987e61acf, + 0x5c29768cb6f92a4d, + 0xa95836fdc4fd38b9, + 0xfc91a4bed3ef5927, + 0xa5ecd86214f28793, + 0x64bd1ef431d485ef, + 0xc486ae143fe8a46d, + 0x12dea4865ceab3d9, + 0xc5a431298aced247, + 0x5b61d4eba9d2f1b3, + 0xe8c6a24edae74231, + 0xdc94b53fe5c62f7d, + 0xac357d6215c83de9, + 0xa5931db323ec4d57, + 0x3f41bd7652df6bc3, + 0x71bf2da982e39b41, + 0xd1c427f76fc4a89d, + 0xbef5628a9ed7c81b, + 0x291c75bfeacbd687, + 0xda3541e1f8acd6e3, + 0x9dac3eb54bd32761, + 0xdb91c42438c524bd, + 0xef5b87d767d8543b, + 0x3a9521d984db52a7, + 0x3ce726dba4cd8215, + 0x4268e9fba2be8f71, + 0xdf5ce87baf928ecd, + 0x194b3261fe95ad4b, + 0x642acef21e96dcb7, + 0x8acb69e43c9aeb25, + 0x5da89fe5478dfa91, + 0x1ef8bac767a128fd, + 0x2357bfeba7c4386b, + 0x71b68afdc3b846d7, + 0xd6a1b52fe2cb8745, + 0x674923b1f2ad85b1, + 0xd549ab1431ae942f, + 0xe1f5da754f93c28b, + 0xcb37f1254d95c1f7, + 0xab3d6f854b98df65, + 0xdbf94e176879fec1, + 0x856329fba78c1d3f, + 0xcdb482afe6813d9b, + 0x29e37b61f6a45c19, + 0x6b32df5213a76b85, + 0x79153ad5438a79e1, + 0x6b3582e5417c985f, + 0x19627d354e5f96cb, + 0x671b9febae82d639, + 0xa57d43ccbc86e4a5, + 0xb67c584edb89f513, + 0x8b197c2fe98b137f, + 0x2dca8572187d32eb, + 0x7c96da8548a26159, + 0xb8e3419874836fb5, + 0x4cdf351ba4978e23, + 0x2b617e9ba1597c8f, + 0x6f29b1d87e4c8afb, + 0x6be8f3cbad4fcb69, + 0x85297cd1fb62e9d5, + 0xc3f845a21c76f953, + 0xbaf267943b5817af, + 0xf96a4726596b372d, + 0x347e5c2ba76e3589, + 0x3c92a8fcb68174f5, + 0x67a3b5eed2859473, + 0x1869ca3ed15682cf, + 0xbc38f52fef59a14d, + 0x872b6d921e3cbfa9, + 0x71289b443b4fce17, + 0xa4cf7be76b52fd83, + 0x59b241f879451bdf, + 0x2bed356ba9482b5d, + 0x4139cabed64b3ac9, + 0xf754182ed64e5a37, + 0x9cb74e61f45178a3, + 0x9c7bfde43465a821, + 0x3b9265754136a57d, + 0xef129c665f28b4e9, + 0x23fe16798e2cd357, + 0x92317ef98a4fe2c3, + 0x2ef736cedc762341, + 0xc8592affea46319d, + 0x1f84ae5ed6273ef9, + 0xda58b942182b4e67, + 0x7ae51fb5452e6cd3, + 0xc79ae65986429c51, + 0x9a25d148712389ad, + 0xf32dc5198f16c92b, + 0x312fad4cbe1ad897, + 0x6d52187dca1bd7f3, + 0x4a5f7c9eda2ef671, + 0x139e5cd54a1325cd, + 0x89da45c76a17354b, + 0xc1d37247681953b7, + 0xfd2c698ba71c8325, + 0x9e8d3c2cb53e8291, + 0xd6bc8f3ba3218fed, + 0x2a458eda9df2ae5b, + 0x136bc98feaf4bdc7, + 0x48fe5ac21bf8ec35, + 0x56fdec4438e9fba1, + 0x762af34658ed2a1f, + 0x89feadb768f1397b, + 0x2f548ebba6f348e7, + 0x3827ef6dc3f97865, + 0x19a276ced3fa86c1, + 0x39274baed1ec953f, + 0x61cbe98321efa39b, + 0x978ac2b65fe4d319, + 0x5a1237c54cd6e185, + 0x7a8216e659b7efd1, + 0xade3c96878ca1e4f, + 0xe219fdb986cd2eab, + 0x6aef815dc7e15d29, + 0xb87dc161f4e36c95, + 0xbe4cfda324d67af1, + 0x9d2ec7b432da896f, + 0x351d6ca541ec97db, + 0x61d849365ebfc749, + 0x1d25c3f98dc2e6b5, + 0xdf457e2babc7f623, + 0x31b2ce9edac9148f, + 0xbdf3417fe7ca23fb, + 0xe968325218ce4269, + 0xeac28db548c271d5, + 0xa92ce4f876c58f43, + 0x31b9f5e762b57d9f, + 0xbdfe3c5872b89c1d, + 0x1b7d2a976f8dbc79, + 0xd2ab473a9b8fcae5, + 0xd26b4c7fecb2fa63, + 0x4b61a8d32ca518bf, + 0x8a5b7cf54ab9283d, + 0x6c8f3a9547bc36a9, + 0xb7dca4ea98be5617, + 0x8ac7ef6cb6c19583, + 0x913c87acb2a483df, + 0x9251fa6fe1b7a25d, + 0x6dca312fef78b1c9, + 0x8d5e7ac21e8bcf27, + 0xd5c4b1f32b7fde93, + 0xdc347b865a831cef, + 0xd6394c887a952c6d, + 0xc1967e5ba6873bd9, + 0xa573f69ed69c5b47, + 0xa49782eed48e69b3, + 0xa589e631f5b2a931, + 0x2dcaf8921293a68d, + 0xb61c8ef43186b5f9, + 0xab5e49143f8ad467, + 0xbc3829a76c7be4d3, + 0xca3bd21a9b8ef351, + 0x72f3a61dcb8432ad, + 0x93d6cfafea97512b, + 0x368b4f7fe5694f87, + 0x62c8d5f2157a6de3, + 0xf41e6754347e8d61, + 0x39bdac1653618abd, + 0xb7365c298174ca3b, + 0x2e15f3798f45d9a7, + 0x248ef53cbd6ae915, + 0x9bef6a4edb5cf781, + 0xdf6b952dc95f16ed, + 0xe9f5b4721c82365b, + 0xc36d17432a8654c7, + 0x4cd9f257697a8435, + 0xf163a45a956c83a1, + 0x6ce2718ba46d921f, + 0x493f512dc251af6b, + 0x76f2de3baf43bed7, + 0x4da81231fc37ed45, + 0xf39dc7b32d48fcb1, + 0xda1c27b54a5c1b2f, + 0x3f64b876594f2a8b, + 0x145d62f98a5249f7, + 0xa234b17dca346975, + 0x8bd6fe5dc54987d1, + 0x7e6fc93ed23b964f, + 0x6485a3e1f13e94ab, + 0x9bad26e65361d429, + 0xa14db9376f34e295, + 0xda49eb376c47e2f1, + 0x4c5bd3a98c4a216f, + 0x9f5a46e8783a2fcb, + 0xf69c752cb82f4e39, + 0x65b19cdfe8326da5, + 0xec716831f7468c13, + 0x58c367e214268a7f, + 0xb1c253f5432a98eb, + 0x5e9ba787612ec859, + 0xeb5fcd498f21e7c5, + 0x214cb69bad15f743, + 0x67a95f1cbc27159f, + 0x58d71c2feb2a351d, + 0x37954811fa1d4379, + 0x64cb2d74391f62e5, + 0x6849a2c87a249163, + 0x7ec8da1765147eaf, + 0x53de491984179e2d, + 0x1f3a94d8721abd89, + 0x42d1ce687deacbf5, + 0x13ad748a9adfeb73, + 0x465bf28edae319cf, + 0x8a3d7c621bf6294d, + 0x56a714c32af837b9, + 0x2bf9ced549fc5827, + 0x75a1fb6985fe7693, + 0x6f3ed8aa95d184ef, + 0xd987265cb2f4a36d, + 0xe45382adc1f6b2d9, + 0x26fe7badcfead147, + 0x6e427fd21ecbdfa3, + 0x86d792154abdfe21, + 0x1c3e6b965ac32e7d, + 0x38e4f52768d53ce9, + 0xe4f3b16ba8e94c57, + 0xfb15876a95eb6ac3, + 0x315f864dc5de8a41, + 0x23145ce1f3e1a79d, + 0x37d859f323e4c71b, + 0xef5a2cd431e6d587, + 0x83f1d2554fb9d5e3, + 0x51a89de87dbcf461, + 0x4aebfd6879af13bd, + 0x4be2d68dcad4523b, + 0xa1f49cbfe9d651a7, + 0xfe7a248ed5b86ef3, + 0xd568971325cb8e71, + 0x3de4f593239e7bcd, + 0xfa8b514763d1ac4b, + 0x9d4ae72761c3dab7, + 0xa3dc21e98fb7ea25, + 0xa1f342d87dbaf891, + 0x517fbe2dca9b17fd, + 0x9ca876ffe9af276b, + 0x674ea2c21ab245d7, + 0xe7a6bd132ac78645, + 0x4c6afe7656c984b1, + 0x1845b6c875ab932f, + 0xd58bc318739ea18b, + 0x48eb5d3ba291bfe7, + 0x46f3c28cbf93de65, + 0x4db23f8feb86fdc1, + 0x47b8cea32d891c3f, + 0x2c97d5b43a7d2c9b, + 0xc6e8ad165a8f4b19, + 0xf3c1ea2879b26a85, + 0xd32e8c4cb6a578e1, + 0x3a2eb9fdc3a8975f, + 0xc1482b3fe27a95cb, + 0xde7c6a91f18ec539, + 0xdb3c7f654291e3a5, + 0x2683a9c65e96f413, + 0x312a9b765d98127f, + 0x341f28a76c7931eb, + 0x14fc53e98a7c3f49, + 0xc57f4bdba87f4eb5, + 0xdc83726fe7948d23, + 0x571dac6fe3647b8f, + 0xbd4fe792135689fb, + 0x679d8cb4325bca69, + 0xde82b5c5416ec8d5, + 0x164af35a9e71f853, + 0xa2d7f15a9d7416af, + 0x21a34e9cbc78362d, + 0x659a3d7fec6b3489, + 0x5cab9f2fe97c63f5, + 0xf35247b21a6f8273, + 0x6937cdb5476381cf, + 0x6be51d2874659f3d, + 0x359b2f887246bea9, + 0xe57c1d3a925acd17, + 0xbe36dc8a9f4dec83, + 0x97ae8cdcbc521adf, + 0x63a17241fc642a5d, + 0x856c2b921d4638c9, + 0xfaec1d632c4b5937, + 0xe81caf26594d67a3, + 0x54fc7beba85f9721, + 0xd359ce7cb652a47d, + 0x7a4b316dc245b3e9, + 0x8142ba6fe149d257, + 0x73f2684edf4ae1c3, + 0xf3a659732d4cef31, + 0x9db3ca265c412f8d, + 0xac43f1876b243df9, + 0x8ebd4afa9b284d67, + 0x8c3bf57ba8296bd3, + 0x12a853fdc73d8b51, + 0x3ae48b1dc42f78ad, + 0xeb126d81f543c82b, + 0xaf45d6b21324d697, + 0x6dcea1b65128d6f3, + 0x52e8df976e2bf571, + 0x29ead5b87b2e14cd, + 0x658c1b3bad21534b, + 0x284a91fedc1452b7, + 0xaf4b675feb398125, + 0x54f2da1fe62a7f81, + 0xab318e53251a7ced, + 0xdb548a24341f9d5b, + 0x19fb43576412dbc7, + 0x712e38ca9216eb35, + 0xafb63d587de6f9a1, + 0x9c5eadb98cea291f, + 0x6f95a14dcafd287b, + 0x7a3f561dc9df36e7, + 0x4fa5c8621bf28765, + 0x5fd8a46439f685c1, + 0xb49d136656e8943f, + 0x13724e5764fca29b, + 0x5ae7213984fec219, + 0xf489c7dba2e1df75, + 0xe7b162aa9cb4fed1, + 0x14a35c2febc71d4f, + 0x27deac421ce82dab, + 0x5b96d7243aed4c29, + 0x1ac967d438df4b95, + 0xaf2d5b4768d379f1, + 0x9bcfe87ba5d4986f, + 0x2594df7ba3e796db, + 0x8ba2763ed2ebc649, + 0x48e63cd1f1ced4b5, + 0x3d1c7f2764d1f523, + 0xe9b17d354ec5138f, + 0x3be46d765dc732fb, + 0xe91863b87cdb4169, + 0xbcf12d9878ab4fc5, + 0x3fd5cb1ba8bf7e43, + 0x8f742a6ed5b27c9f, + 0x92ac7d31f4c59b1d, + 0x5b3e9f7213d6cb79, + 0x5179fa4432bac9e5, + 0x29fad6e651bde963, + 0x5472d3e76ea217bf, + 0x7c28635a9eb5273d, + 0xf92d6a1cbdc735a9, + 0x87ac63ffeacb6517, + 0xc182a571f9bd7483, + 0x4e6b83f2169e72df, + 0x51fc328547b3a15d, + 0x1e326c965384afb9, + 0x713cb28763a8ce27, + 0xfeb146a8718aed93, + 0xa28fb5387c6bdaef, + 0xe5b4f93dce912b6d, + 0xe68dc431fc843ad9, + 0x8d2b5c421db85a47, + 0xdb5169432c9a68b3, + 0x91cd7fe657ad9831, + 0x81493577647f958d, + 0xf5d4b97ba582b4f9, + 0x398d7b5dc2a5d367, + 0xb3e8654dc198e2d3, + 0x63418ebede8bf251, + 0x9546cea43f7e21ad, + 0xa824c7e65d824f1b, + 0xa7f8d3465c934e87, + 0x8abc76965a876ce3, + 0x8fe129acb97a8c61, + 0x6298b4eba45c79bd, + 0x591c72eed46fa93b, + 0xb8c659e1f362d8a7, + 0x713bced32396e815, + 0x85f2b6a54279f681, + 0x3158a7d54f6a15ed, + 0xd4172cf98d7e245b, + 0xeb8c936bad8153c7, + 0xf38ce24edc968235, + 0x2bc8d9afeb6782a1, + 0x3d815badc5487efd, + 0x7a284592154c9e6b, + 0xc43deba3234facd7, + 0xbc3eaf198372ec45, + 0x6a2c71398265fab1, + 0xa28f54ca9e581a2f, + 0x972e3fbbae4c298b, + 0x84936a5dcb4d38f7, + 0x63e29c51fc416875, + 0x159d4b632b5486d1, + 0xab397c832a37954f, + 0x13eadc66564893ab, + 0x197543f9865dc329, + 0x72e438dba34fd195, + 0x73fcd89ba253dfe1, + 0xa4d8691cbd361e5f, + 0x8b7e69a1fd372ecb, + 0xeac935421e2b4d39, + 0xb962d8c43b2e4ca5, + 0x3b2a14887c528b13, + 0xd3c4e7276a23897f, + 0x1b53478ba62597eb, + 0x958cba4ed42ac759, + 0x9f826cafe32bd6c5, + 0x612acb7ed12fe643, + 0xec8329b76253149f, + 0xbd17e5a76f27341d, + 0x2f4379b76e1a4279, + 0x9c264fb98c2b61e5, + 0x74c1d65a9a1d7f53, + 0x3caf725cb8217daf, + 0xc45d239fe7149c2d, + 0xca182b91f415bc89, + 0xf8b1da332418caf5, + 0x1e7f8c66541cea73, + 0x94a2db66521de7cf, + 0x982eb5c87ef1284d, + 0x2d35f1a98df436b9, + 0xcd685e4cbcf95627, + 0x92b5167edafb7593, + 0x28793b5dc6db73ef, + 0xf2ac9bd217ef926d, + 0xd8923bc546f3b1d9, + 0xfb13942764e5cf37, + 0xf4cd297762f7dea3, + 0xd27a13e983eafd21, + 0x17fad9c98fbe1c7d, + 0xd7126bebacd13be9, + 0xb175e9c1fce34b57, + 0xac3b4ef21be769c3, + 0x514ad6843aeb8941, + 0x8c61294435ec869d, + 0x869d2a4875dfa61b, + 0x2fe367cba5e2d487, + 0x4f1d3e6ba2c6d4e3, + 0x3d81ebfdc2d9f361, + 0x5f1b746fefca12bd, + 0xf95a3d732fce413b, + 0x7df186243dc14f97, + 0x4d3fbec65ab46df3, + 0x1dab3e965ac68d71, + 0xa278ce1765b87acd, + 0x3e26b7f985cd9a4b, + 0x2697a3eed3afc9b7, + 0xeb13d941f4c3e925, + 0xe48b1a9323c5f791, + 0x9f235ae542b816fd, + 0xf821b3654fac256b, + 0x4adcb1576cae34d7, + 0xe325df9badc18345, + 0xa7e8529edac583b1, + 0x28694faed8b7912f, + 0x635b9c8fe4a89f7b, + 0x72b38a42148bade7, + 0x1bfa48d3239fcd65, + 0xe9b21df76493fbc1, + 0x415cdb7982a61b3f, + 0x479d52876f872a9b, + 0xa93c61ecbe8c4a19, + 0xb5943c8edcae4985, + 0xd43b5a21fba287e1, + 0xb82f35e21ba3965f, + 0xfda14733278694cb, + 0xb83724d6568ac439, + 0xb25adc88748cd2a5, + 0x7849d32ba59fe213, + 0xa6d3f94dc3a4217f, + 0x689fd2ebae752fdb, + 0xb4cd1a61fd783e49, + 0xb8d953a21e7a4db5, + 0x92d17f854b8e7c23, + 0xf72189354b617a8f, + 0x4f32cba6576398fb, + 0x9f85acecb475c869, + 0x5d19c37cb369c7d5, + 0x14c729eed28ce753, + 0xe13f859dc16de4af, + 0x1e453cf76194352d, + 0x1ac8bd932f764389, + 0x7be91df54d7962f5, + 0x316a782a9d6c8173, + 0x3a412bc8784c6ebf, + 0x25f6ed4cb8619e3d, + 0x74f286bfe653bda9, + 0x8c926e51f456dc17, + 0x7d89a5e21459eb83, + 0x41fb9284324ae8df, + 0x3b426fc8726f195d, + 0xe951bca98f5237c9, + 0x7aec19fcbe465837, + 0x6e58273dcd4976a3, + 0xa9452c6feb5c9621, + 0xdc62e341f84e937d, + 0x84be6d943851b2e9, + 0x7fb6d4c43964d157, + 0xbe831a587546dfb3, + 0xc2d6bf998459fe31, + 0x5ea7db4a924b1e8d, + 0x4ce17f398d3e2cf9, + 0xc7a49f2ede324c67, + 0x7d8e6941fc256ad3, + 0xe1f785432d398a51, + 0xeb92f5a4392b87ad, + 0x49cdf3a6583ea72b, + 0xfe69547ba831d597, + 0x167bde2ba724d5f3, + 0x153498edc538f471, + 0xa17935cfe24913cd, + 0xf324a97fef1d324b, + 0xa84d65b43e2f41b7, + 0x32ed91876d237f15, + 0x7bd4ce276c257e81, + 0xfcbd92e659167bed, + 0xd4731a29871a9c5b, + 0xef82d65a951ebac7, + 0xb7a98f3ed721ea35, + 0x491f2c5fe524f8a1, + 0x8c791b254537281f, + 0xf1786d36531a267b, + 0xfdca35154dfb35e7, + 0x3712dca98cfe7465, + 0xf12eb46a9bf284c1, + 0x7fa3469cbae5923f, + 0xe628f93ed7f6a19b, + 0x3d68a9bdc4d8aef7, + 0xb9726c4214fbce75, + 0x8f6dace434bfecd1, + 0x6a9528d875e31c4f, + 0xfbe38a6871f52cab, + 0x2396eb487fe84b29, + 0x67a15c398dec4a95, + 0x6fad8e1cbacd68f1, + 0x86dac92fead1976f, + 0xc35de8f218e395db, + 0xa4169be328e7c549, + 0x53d1b8c546e9d3b5, + 0xb76cd9e986dce423, + 0xb2e56ad873bde18f, + 0xfd5768eba2d431fb, + 0x76d2c3fcbec63f59, + 0x7a589431fdb84ec5, + 0x83b29fd21ecb7d43, + 0x15e3a9f328ad6b9f, + 0xea7df84658c29a1d, + 0xbe24c9d656d3ca79, + 0xc21f68aa94b6c8e5, + 0x2a35916cb4cae863, + 0xf7ab318dc29ae5bf, + 0xb9a4326fe2bf163d, + 0xe4a7fc2651d234a9, + 0x721948e43fc86417, + 0x9738f2e65eca7283, + 0xef7ba2165b9a71df, + 0x197eba27679c8f4d, + 0x649a715dc681aeb9, + 0xa729b45fe6a4cd27, + 0xe4c532a1f4a6ec93, + 0xfe643bd21387d9ef, + 0x391fb675439c1a6d, + 0xe6849c2651af28d9, + 0xa7d946f98fb25947, + 0x578bc6da9ea567b3, + 0xa492315dcdba9731, + 0xf1784bafea7b948d, + 0x6a287b1fe67da3f9, + 0x27c86b5439a1d267, + 0x7b8d5e354795e1d3, + 0x154c9b776597ef41, + 0x5b2eca8763781f9d, + 0xb8364a5a928c3e1b, + 0xed2c853bae6f3d87, + 0x7e24b35dcd826be3, + 0x93cd51e1fd958b61, + 0xe5b93f721c5678bd, + 0xc91fa533296ca83b, + 0x9c418fd4385ec6a7, + 0x579fd18ba892e715, + 0xac6e542cb694f581, + 0xc84576dcb38714ed, + 0xb1c8f4afe18a235b, + 0xc31afd5fef6d42c7, + 0xb9846cd32e8f7135, + 0xd3e2ab954d637f91, + 0x9d1f7b643a547cfd, + 0xa67d3bf65a479d6b, + 0x1a534b798649abd7, + 0x27ed956ba76edb45, + 0xbaf3682ed562f9b1, + 0x5d4f27cfe475192f, + 0xb3e24fa21356278b, + 0x83f5a275415a36f7, + 0x3e7d65998f3d4675, + 0x925e71698c4f75d1, + 0xd12c549bac62934f, + 0x2c69a4fedc4592ab, + 0x95cb1f3fea58c129, + 0x215384ffe63acf85, + 0xeba5f683264bcde1, + 0x67a9f5e547621d5f, + 0x4feb6d5873542dcb, + 0x7c2596fba1574c39, + 0xe56ca7d98f294ba5, + 0xfc17234cbe4d7a13, + 0x29da568dcb2e687f, + 0xad952831fa3296eb, + 0x3b65fa821b24c659, + 0xc7624ae43928d4c5, + 0xceb3f1a8782be543, + 0xf69dc3b8753ce29f, + 0xa3615f7cb762431d, + 0x79e1c5fed2354179, + 0x58df349cbe174fd5, + 0x1e36a851fd1a7e53, + 0x514369f32d1b6caf, + 0x3cb12ef54a1f8b2d, + 0x6e32d9165a12cb89, + 0x8163de587814c9f5, + 0xe685c71cb618e973, + 0x97cf31dba419e6cf, + 0x962b71adc52e174d, + 0x479dab11f42135b9, + 0xbfae563983146527, + 0xce741bd32ef67493, + 0x983b21554bd872ef, + 0x87bda4265afb916d, + 0x7c12683656ed8fc9, + 0xcf7de82ba8f1ce37, + 0xca4895fcb6f4eda3, + 0x1562bfeed5e7fc21, + 0x74edacf324f91b7d, + 0xd857e92543fc2ae9, + 0x485d29e761ef3a57, + 0x9f2e1bd87fe268c3, + 0xd817f9ebade69841, + 0x85de961babe7859d, + 0x7bc683aed8eca51b, + 0x9c1edb61f6dec387, + 0x6eb251d548c1d2e3, + 0x869e57d548d5f261, + 0xb7f9d15765e721bd, + 0xb45c132874d93f2b, + 0xaed92f6981dc3e97, + 0x47a652c98dae5cf3, + 0x6d4a359cbed38c71, + 0x52849cd1fab479cd, + 0x872cde321cd7a94b, + 0x548abe7326dac8b7, + 0xb1736a9547bed825, + 0xac2e34d987c2f691, + 0x6184fdaa96b415fd, + 0xb6a3194dc3d8246b, + 0xc3674f9fe1ca43d7, + 0x5b8a21cfefbd7245, + 0xc69e7da43eaf72b1, + 0xca27e9154ca38e1f, + 0xfe5b86443ca49e7b, + 0xe7286da54896ace7, + 0x47baf219879adc65, + 0x8abf542a958deac1, + 0x37629f4ed6b21a3f, + 0x1ed5a891f3c4289b, + 0xc38fd49323c74819, + 0xbe581a4431cb4785, + 0x5b1e62f54f9c76e1, + 0x1c53d4e76c9e845f, + 0x84bdfc187d8293cb, + 0xb89acf2edba6c239, + 0x56baf78fe798d1a5, + 0x9ef78b5ed579cef1, + 0x7a5f2ce2147bed6f, + 0x518ecaf545812edb, + 0xcd1ea32872a53d49, + 0x3419fd7981974cb5, + 0x7648ad5a9f8a7b23, + 0x2c79febbad5c698f, + 0x9a8fb36dca5e87fb, + 0x7c426851fb82c769, + 0x9dbfa2c21a84c6d5, + 0x57e193832a89e653, + 0x93e26da54569e3af, + 0x65a7124a968e142d, + 0xd6e175fdc5a14289, + 0x6953e4bdc29461f5, + 0x851a934dce587f63, + 0xb675934fec486dbf, + 0x98de2c421e5b8c3d, + 0x95fdb1332b4f8ca9, + 0xca4fed765a63db17, + 0xba8e1d487965ea83, + 0x5bd6e4fa9546e7df, + 0x2af8675dc46b185d, + 0xb2fac58ed35e26c9, + 0x38756b91f2915637, + 0x5c38b763218475a3, + 0x265bc3d54f689521, + 0x48c32ae65e4a927d, + 0xd51b32a76b4ca1e9, + 0xfe569439893ebf47, + 0x74b9e2fba852deb3, + 0xe8a4625dc856fd31, + 0x5193cde1f5471c8d, + 0xc375fb42154a2bf9, + 0x4a879fe6524e3b67, + 0x76fb2949825169d3, + 0x192e368baf348951, + 0x43a6857a9e2586ad, + 0xba614fedcd39a62b, + 0x165f384fea2dc497, + 0x85eb63ced82ec4f3, + 0xcfe986532a54f371, + 0xed86b4c6584612cd, + 0x4cdae2198759314b, + 0xfe1bad59842b3fa7, + 0x67de39cba23d6e15, + 0x54c6ea8cbf327d81, + 0x45f6371cbc137aed, + 0xc6349da1fd169a5b, + 0x8b16e5732d18b9c7, + 0xb9a5f1c54a1cd935, + 0xca36d7e6582fe7a1, + 0xe62b53fba934271f, + 0xbd8a573dc816257b, + 0xd35ef74dc51934e7, + 0xb57c469fe21c7365, + 0xd4ec726cbefd73c1, + 0xa1b835d32cde813f, + 0xd8fca9e43ce29f8b, + 0xf875a1c439e4adf7, + 0x6237dba549f8cd75, + 0xb1e98c6876f9ebd1, + 0xd57f3e9985dcea4f, + 0x851e7b3ed5f129ab, + 0x16975dafe3f54a29, + 0x36a859f212f74895, + 0x1723b56542ea67f1, + 0x1c9875d43edc856f, + 0x63a18d765acf84db, + 0x372f5ea98be2c349, + 0xf78951dba9e6d2b5, + 0xba96df7dc8d9e123, + 0x5819e4ddc4b9de7f, + 0x6c3e94f325ac1feb, + 0xae8b37d546d13e59, + 0x2ecb134872e34dc5, + 0xe321645a91e87c43, + 0xdc9617265ec86a9f, + 0x21f6ce487ebc891d, + 0x1fb278aedacfb879, + 0x1d4bac71f9b2c7e5, + 0x4cb39de21ac5e763, + 0xbae6c15326a7e4bf, + 0x41dea93767cb153d, + 0x859c2a3875ce23a9, + 0x91e34c2cb5d26317, + 0x69a3f15dc2d57183, + 0x72cd9b5bad956ecf, + 0xc754b9e1fca98e4d, + 0xdf68c4221e7c8db9, + 0xbfc219843a9fbc27, + 0x8b4fae2658a2eb93, + 0x67ecd1a65694d8ef, + 0x2b3e65dba5b8196d, + 0x5419bd8dc4ab27d9, + 0x284e35ced2be3847, + 0x6c183941f2c176b3, + 0x83be6af542c59631, + 0x1af64c332fa6938d, + 0x9fec57d54d78a2f9, + 0xbf16cd265b9dc167, + 0xef5a3d47687ebfc3, + 0x81d297acb893fe41, + 0xf342e87dc6851e9d, + 0xc17d43b1f5983d1b, + 0x9be386c2149b3c87, + 0xead36c95428d5ae3, + 0xac1df95873b28a61, + 0xd9f32e765f6387bd, + 0xa285b6ea9e86a73b, + 0x1e73496cbd69c5a7, + 0xcd3a641fea8cd615, + 0x3c524f9ed97fe481, + 0x453918e3298413ed, + 0x2596cd354897325b, + 0x95cf3877658941c7, + 0x5437a8fa938b6f25, + 0x249f751ba27d6e91, + 0xbf3ca5ea9e517bfd, + 0x938a2ceede539c6b, + 0x6c5eba11fc45bad7, + 0x89b25a621c69da45, + 0x4b19e8c4395ce8b1, + 0xb8ca3125485de72f, + 0x5b4d621ba973268b, + 0x8d5c314cb48635f7, + 0x542396eed28a6475, + 0x43bf2dafe26b74d1, + 0xe61f435dce5d824f, + 0x8ae6c7143f5291ab, + 0x4fdb12e43d54bf19, + 0x5eb197654b36ce85, + 0x4d315ca76948dce1, + 0x5a7bc399873aeb5f, + 0x17854e3a964f1acb, + 0xb836fcdfe7624b39, + 0xd362b1e1f23649a5, + 0xae6b9783245a7913, + 0xa7158fe5413b867f, + 0xcd6198554f2d85eb, + 0xd76a42c98e31c459, + 0xbc6f41aa9b24d3c5, + 0x35eba27dcb58e243, + 0x2b59d67dc738e19f, + 0xa2c59741f85c321d, + 0xfd82c952173e2f69, + 0x8cbad97767324ed5, + 0x52cb7a8a94267d53, + 0x49efbc6981276baf, + 0xe5d86fb87f1b8a2d, + 0x5813e6487d1eba89, + 0xf6b7823edb21c8f5, + 0x23da98b1fb14e873, + 0xf6b14ce32916e5cf, + 0x7a132bc6592a164d, + 0xb4d785a7671d24b9, + 0x83be924ba81f5427, + 0xe46813ddc6147293, + 0xf615729cb32571ef, + 0x463d51ebace68f5d, + 0xf624a31edbf78ec9, + 0x9675da221afcbd37, + 0xe4dfa35328efdca3, + 0x2438cde769e4fb21, + 0xc9e3f82768f51a7d, + 0xd832f97ba5f728e9, + 0xf6d4c8ecb4fc3957, + 0xa561427cb2fe57c3, + 0x14698cafe3f29741, + 0x84c5fde321f3849d, + 0x2a98c4543fe7a41b, + 0xb9dfec554deac287, + 0x2bfc4e5769dbc1e3, + 0xab64f8c878bedf51, + 0xfa32c74a97c31fad, + 0x5fa6d43dc7d63e2b, + 0x89a5e1d1f4e83d97, + 0xef39d78214da5bf3, + 0x28e5b1a543de6b71, + 0x6cf329a652e178cd, + 0xbdafe2876fd3a84b, + 0xe276d3198ed5c6b7, + 0xc25f1bea9bcad725, + 0x9852a6bed8bce591, + 0xfe69a81cb69ce3fd, + 0xf8e53cd219d4236b, + 0x894d521438c642d7, + 0x59d7a32986da7145, + 0x6ae2f81873cb6fa1, + 0xa37691c982ac7d1f, + 0x2cd64f398fa19d7b, + 0x8a31de7dcd93abe7, + 0x28417ba1fca7db65, + 0xc7b513632ba8e9c1, + 0x64e89cd3279be83f, + 0x5768f2c546af179b, + 0xb658ecfba8c34719, + 0xe367fcacb3c74685, + 0x35b86e4dc3b975e1, + 0x7ac968bed1ab835f, + 0xc4f5a67edf7e82cb, + 0xd5f92cb54fa2c139, + 0x47e169b32d83cf95, + 0xf2d19be54a86cdf1, + 0xf95162354978ec6f, + 0x25bf7ce9867a1cdb, + 0x3cd7f81cb68f2c49, + 0xd815642fe6924ab5, + 0x23c5dae1f4b67a23, + 0x9e6f58d212a9678f, + 0xa9125c44317a86fb, + 0x72be85d43f7eb569, + 0xad586b387e81c4d5, + 0x5dcb763bac96e453, + 0xd14a926cb976e2af, + 0x53bdc41fe98a132d, + 0xae641d21f67d3189, + 0x459b78c2167d3fe5, + 0xeb16f79545927e63, + 0x91f73ec652746cbf, + 0xde8b3faa91678b3d, + 0xe5c879d76f4c8ba9, + 0xd2b85a4a9d5eca17, + 0xf8e7b15edc61e983, + 0x26317a5dc953e6df, + 0xc65b7a132b68175d, + 0xcaf71894386a25c9, + 0xdbc25177698d4537, + 0x63a1d84a957f64a3, + 0x75dfb86dc6859421, + 0x97df6eadc265917d, + 0x29f84c6cbe368fd9, + 0x742e83b1fd3abe47, + 0x4e2753a21a4ecdb3, + 0xdfb28a365b62fc31, + 0xa4f8ce776a541b8d, + 0x2eda4fb878462af9, + 0x84e3927dc84b3a67, + 0xac734e9cb64c58d3, + 0xac21765ed34f7851, + 0x79ea5d61f14285ad, + 0x6e2958c43146a52b, + 0x92b15ce54f28c397, + 0x5e7c19876d4ac2f3, + 0x26dcbf498b4de271, + 0xc6a528da9a5321cd, + 0xe78d5b9dc9452f3b, + 0x543b129ed8263ea7, + 0x3cb51de1f73a6d15, + 0x7cf846d3253d6c81, + 0x6da7eb95432f69ed, + 0xb48239c87132a95b, + 0x452713976f14b8c7, + 0xb15493fbae19d835, + 0x42af731a9c2be6a1, + 0xc79351ecb92ce51f, + 0x6532c8e1fa31247b, + 0x39d81f632a1543e7, + 0x861f3d254a197265, + 0x9f6cdb39863a72c1, + 0xb96dea49841b7e2f, + 0xb8c41d6a921f7e8b, + 0x95a436d98de1acf7, + 0x1d76452babf3dc75, + 0x4a79158dc9f6ead1, + 0xd6f39a221ad8e94f, + 0xfc57198437fd18ab, + 0x87e34a9657ef3829, + 0x63dec74ba8f24795, + 0x8719b54ba4e576f1, + 0x437ad62cb2e9846f, + 0x3d76145dc1fa83db, + 0xfd378ebdcfdeb249, + 0x8241bdc43fe2d1b5, + 0x6ef13b954bc5df13, + 0x4825da7439b5ed7f, + 0x46f13bd657c81deb, + 0x1f346a2987ec2d59, + 0xbc2f154a96df3bc5, + 0x852f91ced6e27b43, + 0xd95a6b7fe2d4689f, + 0xfdae93b323e7981d, + 0x5d8249a431ecb679, + 0x6c2b1a743fadb6e5, + 0x7c1e69598dc1e563, + 0x6ea9813879a4e3bf, + 0xe4723c8cbac8143d, + 0x53dfc82fe7db32a9, + 0xd3a29b81f8cd5217, + 0xa289bcf216be5f73, + 0x4d9bf7a434a26dcf, + 0x9dc5fa2762b58c4d, + 0x7e61d4a651d68cb9, + 0xf3278eb76f9acb27, + 0x39d564a87c8eda93, + 0xadfc4e9cba91d7ef, + 0x5a9c7341fab4186d, + 0x783f52b21ab726d9, + 0x6c5184b329cb3647, + 0x7dc9bf8547ad65b3, + 0x8edf432a96bf8531, + 0x6bd2e93ba4b3928d, + 0x51a8649dc2b5a1f9, + 0x6b8fa39dce98bf57, + 0x46c1e751fd79bec3, + 0x843b9e132b8ced41, + 0x8a126c354b821c9d, + 0x82a437c76a953c1b, + 0x3869aed659a63b87, + 0xef23947cb68a59e3, + 0x2dbf1e8dc4ad7961, + 0xe5294d7dc28f76bd, + 0xc139dea1f192a63b, + 0x3b764ed32195c4a7, + 0x75cb8fd43f89d415, + 0x2e9fab865d7be381, + 0x7dc64196596bf1ed, + 0x1e5b62fbac92315b, + 0xb632d75dc9843fb7, + 0x13e2a58ed7986e25, + 0xcd45e9b1f47a6d91, + 0x549a8bc2135b6afd, + 0x9bd2a484325f8a6b, + 0xa67f31b65162b9d7, + 0x71fd36298f76d945, + 0x4817cb3a9d58e7b1, + 0xdc5e4baa9b5ae62f, + 0x187953aeda6e158b, + 0xd9243acfea8134f7, + 0x63254ca21b946375, + 0x2791e585496873d1, + 0xadb68398756a814f, + 0xd1cb2977624c7f9b, + 0x1df4c3e9825fae19, + 0x986e17dbaf42cd85, + 0x519f6b3bac45dbe1, + 0x947c1e6edb37ea5f, + 0x7bfd4e332d4a19cb, + 0x82e59fc54b5e2a39, + 0x3adb89487b6148a5, + 0x413fdc9cba657813, + 0xe98c1f6cb436857f, + 0x53ea876dc23984eb, + 0x835269afe14db359, + 0x7bf19aeede3fb2c5, + 0x5a4c78132f65e143, + 0x26d157a43b24de8f, + 0xc38f94d65a371efb, + 0xe345c1d87a3b2e69, + 0x67b4e2fa982e3cd5, + 0x19a8e7ced9417c53, + 0x7a29e4fed52369af, + 0x316cbe71f436892d, + 0x9643c5b2132ab789, + 0x36f79a85412cb7f5, + 0x129ae3b65e1fd673, + 0x4c51e8a87b12e4cf, + 0x6b3e829bac27154d, + 0x6aef43cedc1823b9, + 0xdf7946afea1c5327, + 0xb1946731f82e6193, + 0xec192f5437216edf, + 0xd39ef61546138e5d, + 0xb85724f763158dc9, + 0x3e6cd4a98219bc37, + 0x235eac476ef9dba3, + 0xed1c32f98bfdea21, + 0x315bd84dcbf2197d, + 0xa53b7f2edaf427e9, + 0x348d25a21bf93857, + 0x9eafb16328fa56c3, + 0x24f3b1e657fd8641, + 0xc9fab13764ef739d, + 0x8e17d32a95f4a31b, + 0xa295167cb2f5c187, + 0xf4be8cda9ec7bfd3, + 0xab547361fbcade51, + 0xdabe7c92189bfcad, + 0xca2b41d65ae13d2b, + 0xaf1c4b965ae43c97, + 0xba58e43768d75af3, + 0x8c4dbe3a95eb6a71, + 0x16d23cba93eb67cd, + 0xeb58716dc2df974b, + 0xca5b16d1f1e2c5b7, + 0xa59d81c431e7d625, + 0x261e8bf43fc8e491, + 0xa2fb5d154ba9e2fd, + 0x9dca34b87ace126b, + 0xc7415a3a9ac241d7, + 0xc8723e4cb9c46f35, + 0x45bf9a1ed5c76ea1, + 0x763d9b2fe4b97c1f, + 0xb58fe74213ad8c7b, + 0xb85da9e432bf9ae7, + 0x6253abd871c2da65, + 0x51247bf76fa5e8c1, + 0xb9a5f7e76ca8e73f, + 0xc6f4d2998dac169b, + 0x341e69aedabe3619, + 0xc53ead71fac16485, + 0x6f3a845329b574e1, + 0x4f9a1d2436b7825f, + 0xd82a719654a981cb, + 0x219ca877638caf29, + 0x6ecf8418718fbe95, + 0x82b31c5a9e83dcf1, + 0xef36852bac84eb6f, + 0xed481b51fc871adb, + 0x3f2ca9621d8c2b49, + 0x4db6ae832a8e39b5, + 0x45e2bac76ab17923, + 0x2acd64ba95a3768f, + 0x4bcd259ba39685fb, + 0x98ab54eed28ab469, + 0x5b31f7afe18cb3d5, + 0x2965be8dce8fd253, + 0x13f4dbe32d73e1af, + 0xdbf843165e97312d, + 0x7a58e2c54c682f79, + 0xfa312eb7697a3de5, + 0x521cf96ba98e5d63, + 0x97e13a2dc5716abf, + 0xad5fbc4fe5748a3d, + 0x8c3e92a1f265b8a9, + 0x4679f1e3236ac917, + 0xf2567985416cd783, + 0xcb7d15e43b4ec5df, + 0xb7dace3a9e83165d, + 0xc2fe184bad7624c9, + 0xb37c941edc8a5437, + 0x86a49dbfe97c62a3, + 0x5d1ba271f97e8321, + 0x68ac319327518f6d, + 0x9c7deb6324538ed9, + 0x613d5ac98256bd47, + 0xdbf168487158dcb3, + 0xd51e62998f5ceb31, + 0x8b5decf87b3ef98d, + 0x4789a2cedc5328f9, + 0xc7b1ad21fc453967, + 0xcf5d87e21b4957d3, + 0x684791f43a4c8751, + 0x2bf861a6563e74ad, + 0x8a3c614a9761a42b, + 0x3e1c8a2cb354c297, + 0xe8915afcb257c1f3, + 0x27698e4cbe39df61, + 0xfb865a1dca29febd, + 0x371e85f32c4f1e3b, + 0x9a7ce1b65c423da7, + 0xde4532698b376c15, + 0xf15c4ba87a396b81, + 0x3f675d4a952a68ed, + 0xfa48d96dc42e985b, + 0x49518b3fe431b6c7, + 0xac726e81f124d735, + 0xa9b5e3754237e5a1, + 0x46a12f765d29e41f, + 0xb15d49e76e2d137b, + 0x35fb29d98b1f32e7, + 0xe715329cbc237165, + 0x6a84359dc9256fb1, + 0x53e2678dc6187d2f, + 0x9de87421f41a7d8b, + 0x5c9f4de3241d9bf7, + 0x8edca9f76421db75, + 0x96fcd4587324e9d1, + 0xba1c9f876cd5e84f, + 0x5e4a29876df817ab, + 0x3f9524bbabfc3729, + 0x295a68bdcafe3695, + 0xb6f23c9ed9e275f1, + 0x78bc645219e4836f, + 0x694fce2435f682db, + 0xedf893c765fab149, + 0x832dab7762ecbfa5, + 0xd2b4eaf982dfce13, + 0xf3e16bc98db2ec7f, + 0x6abc21da9ad51ceb, + 0xd97a8141fbe82c59, + 0x43c6fa7219eb3ac5, + 0x9f15c67329de6a43, + 0x8c5273b548d1679f, + 0x9d15423986e4971d, + 0xc5b3298ba3e6b579, + 0xd284165ba2d9b4e5, + 0x6a38795cb1ecd463, + 0xc9f1b32bac9ed2bf, + 0x71edbc654fc5123d, + 0xe7d581b54ed631a9, + 0xb1fca2954ab83ef5, + 0xc52d749769cb5e73, + 0xf53b4ad8769d5bcf, + 0x2bd3ec7ba6c18b4d, + 0x57f94c2fe4d38ab9, + 0xae4db9c1f3d6ca27, + 0x2d4a396212cad893, + 0xec4126b4319ac6ef, + 0x6ef2c7b43c9ef56d, + 0x6c8bfd287eb325d9, + 0x83b6d5cbadc83547, + 0x1fac835edac964b3, + 0x27468d3fe9bc8431, + 0x8a1472b1f5ae718d, + 0x5e743b8325a18fe9, + 0xc79351a324a3be57, + 0xf9e6b1d65296bdc3, + 0x6d82ae1872a9ec41, + 0xf6b378d65e6bfa9d, + 0xfa48c61a9d8f2a1b, + 0x28f6a37fedb23a87, + 0x25684d91fba658e3, + 0x583ea4b32cba7861, + 0xad5b4373268a75bd, + 0x93bdefc5468e953b, + 0x45126fc98591c3a7, + 0x3c15f7acb4a6d315, + 0xf5b18d3dc3a7e281, + 0xdc2f13ba9b57efcd, + 0xdf73bc4fed7c1f4b, + 0xea2543b21c6f2eb7, + 0x3e2adb854c936d25, + 0xd79cb3854b856c91, + 0xce135a95485769fd, + 0x184f963ba45c896b, + 0x8e6f43acb35ea8d7, + 0x431acf2fe391d845, + 0xd75824e1f284e6b1, + 0xc48dba243187e52f, + 0x6e4c5a943f6a148b, + 0xf8b4c7265d6c23f7, + 0x28cd736a9c8f4275, + 0x6e53f84bab8472d1, + 0x46591f8cb9657e3f, + 0x97ac825ed5467e9b, + 0xd58a71b1f45bad19, + 0x5a8bf322134ebc85, + 0xfbad7c865462dae1, + 0xa35b6f187163e95f, + 0xd2cf18587f4618cb, + 0x62c8d9bbae5b2839, + 0x3178f92cbc4d37a5, + 0xa3b68e5edb5f6713, + 0xab49f12fea52847f, + 0xfd58cab2194583eb, + 0xfe82d9443748b259, + 0x36ce8d18764ab1c5, + 0x6392ac79845dcf23, + 0xa472b13a9241ed8f, + 0x3ef48d2a9e341dfb, + 0xdbea495dce372d69, + 0x6d594eb1fc293bd5, + 0x478965221c2d6b53, + 0xecda5674392e58af, + 0x8ed2fa576a43982d, + 0x32f571dba724b689, + 0x5f937d8ba428b6f5, + 0x9846f15dc42bd573, + 0xfe6423dba12bd3cf, + 0x162ac47fef52134d, + 0x98beaf654f1532b9, + 0x43a8d1f76e395127, + 0x7c15e9a76c1a5f83, + 0xb7198527681a5cdf, + 0x4a5cf23a981f7c5d, + 0x7f3219bed6128bc9, + 0xfa2c3b6fe615cb37, + 0x751c3241f417d9a3, + 0x8b19efc5453be921, + 0x7a396d15421cf67d, + 0xf2b387a54cdf16e9, + 0x8345da1a9df23657, + 0x857f63da9bf765c3, + 0xdf79e65dcbfa8541, + 0x1f5ade9dc6fb729d, + 0xe53a76bed6fe921b, + 0x874cf53325e1bf67, + 0x96e7da1325f4bed3, + 0x17c524e763f7ed51, + 0x39d2671651e7fbad, + 0xa238e4987fed1c2b, + 0x963742e98cdf2b97, + 0xa2d3fb1dcbd259f3, + 0x51a2c861fbe56971, + 0x3475bc9219e876cd, + 0xadfe347327ec964b, + 0xaf5c819435dea4b7, + 0x83251efa97e1d425, + 0x8c56b92ba4d5e391, + 0x8fb2d34a92b6e1fd, + 0x268f4eadcfda216b, + 0xdab1247fedab2fc7, + 0xd675a4e21cbf4e35, + 0x39b7ca254bc36da1, + 0x1bcef82549c57b1f, + 0x87baf23545d68a7b, + 0xe4c35d9764cba9e7, + 0xe5df39cba3bec965, + 0x57e2689ed4b2e7c1, + 0x6789aeced1b4e63f, + 0xcbe5f42432d7159b, + 0x32e8ab754fcb3519, + 0x5daec9b76ebd4385, + 0xa1cd23f87baf63e1, + 0xe67243ca9ab3815f, + 0x319aeb8dc6947fab, + 0x2bc618aed5b7ae29, + 0x93c4eb21f38abd95, + 0xf76b4833248dcbf1, + 0xd7f21c354391ea6f, + 0x317b8e2762a419db, + 0x7ae149b76fb72a49, + 0xfe29c4d87e9a38b5, + 0xe94c2a8cbcad6823, + 0xfd27ab5dca9e658f, + 0xa72f589fe79284fb, + 0xacbef9d218a5b369, + 0x51ed9a743698b2d5, + 0x2f581ac8769bd153, + 0x2d3694a6526bce9f, + 0x6f5412bba4932f1d, + 0x7132fc5cbf842e79, + 0x6371ef8cbd873ce5, + 0xd2591b31fd8a5c63, + 0x7fa6dc521a6c59bf, + 0x395dbc632a6f793d, + 0x21a3e8b54862b7a9, + 0xe487c2bba695c817, + 0x654ac19cb479d683, + 0x6f51dbeba269c4df, + 0x1e289f5cb17cf35d, + 0x286bda5fef7123c9, + 0xed783c521f965237, + 0x96bfe7d54e7861a3, + 0xc8bf26743a485def, + 0xd9e68ba6594b7e6d, + 0xb9254de9864f7cd9, + 0x87fe5a1ed862bc47, + 0xc574d12fe465dab3, + 0x1ae2c691f468ea31, + 0xf463dba2124af78d, + 0x89bfec25425d17f9, + 0x6cf4ed5a9f513867, + 0xe17f6baa9e7456d3, + 0xe6c4928cbd498651, + 0xef3b164dcb4973ad, + 0x64cfb82fe85d932b, + 0x15bac96fe64fb197, + 0xebc796521752bfe3, + 0xd916e2843745de61, + 0x974bdc665236fcbd, + 0xd437cfe9825a1d3b, + 0x934aed598f3e2ca7, + 0x24173eddce426b15, + 0xba39d7ffed346a81, + 0x7dbc64a1fa2567ed, + 0x5f3ed2b21c2a975b, + 0x87cfa2b4382da5c7, + 0x892e3b68782fc635, + 0x76e5d2ca9753e4a1, + 0xcb561e7ba546e31f, + 0x3f65c94ed349127b, + 0x2d459e1dcf2b31e7, + 0xf2cad9bfec1d3f45, + 0x3b569e854d326eb1, + 0x7bc634265b147c2f, + 0xadb8e7354a157c8b, + 0xd1a4b32656189af7, + 0xd8fe1a6a961dca75, + 0xdc517fbba52fc8d1, + 0x1a5472ddc512e74f, + 0xdea46151f32516ab, + 0xaecb37d6541a3629, + 0x4c3ba6932efb3495, + 0x21f7b3465bec64f1, + 0x62341dc65ade726f, + 0xbc5ea3d879f381db, + 0xfa2e51ccb7e5af39, + 0xd894f3bdc4f7bea5, + 0x518ab2ffe5facd13, + 0x9f5eb6d213ecdb7f, + 0x1d2c3a9654f21aeb, + 0x9842fe6871f42b59, + 0x1cd258a76fe739c5, + 0x63d1fa498deb6943, + 0xea7619598adc569f, + 0xa82569dcb9cf861d, + 0xe3bc9a41f8e2b479, + 0xf8c956e218d6b3e5, + 0xd37815f547e9d263, + 0x7d2eac3654c9d1bf, + 0xf1a5b2c763abef2d, + 0xbf82617ba3d12f89, + 0xde64528a9eb43df5, + 0x3d96a74cbec85d73, + 0x843ba2ffe9b85acf, + 0x7f8e534219bc7a4d, + 0x13b65f8326cf78b9, + 0x1f9387b658d3c927, + 0x576fbce986c5d793, + 0x7d3ba4f983a7c5ef, + 0x12c7bf3a92baf46d, + 0x37b9154dc2be14d9, + 0x2d9fa86fefc15347, + 0xa4e7bf221fc562b3, + 0x24c7deb65ec98231, + 0x8f65a9443ba96f7d, + 0xf5b83ac5468b7de9, + 0x92c1d3b9869fad57, + 0x96715f8ba692dbc3, + 0x83ef95bed5a6eb41, + 0xd467a9ffe2a6f89d, + 0xc2b867a434ac291b, + 0x875c263541be2987, + 0x4baf1d576fa157e3, + 0x7db82f1a9eb48761, + 0xc39147d98c9674bd, + 0x28ce617edc8a943b, + 0x9c47315fe68db2a7, + 0x3dca582fe79fc215, + 0xde7153432693df71, + 0x6be378132374fecd, + 0xf4b3ce5763981e4b, + 0x9da2ebc7618a2db7, + 0x46d1ebaa9f8e4c25, + 0x582d43adce826b91, + 0x24df9e5dcb7368fd, + 0x126ed351fc75986b, + 0x2b968c521b59a6d7, + 0x17ab8343298dc745, + 0x19ac23d5467fd5b1, + 0xcae528da9683e42f, + 0x1a27e46dc496138b, + 0x1f9e48bdc18932f7, + 0xc543be8edf8c4175, + 0x268573ffeb6d5fc1, + 0x5a73c8b32c617d3f, + 0xe47fd1632c537d9b, + 0x27d3ecb54b56ac19, + 0x453bf2776749cb85, + 0x692de459865bc9e1, + 0x9e12bd3ba34ed85f, + 0xcad43f7fe46317cb, + 0xb582a471f1862739, + 0x96e5cdf3217936a5, + 0x269e1cb54f5c7613, + 0x7b624cf65c4d637f, + 0x6f429a587c5182eb, + 0x7eb5394bac64b159, + 0x6d35794dc836afb5, + 0x9fae3c6ed759ce23, + 0x1ac6f9dfe43adc8f, + 0x79be63a2143deafb, + 0x3d61ba8874532c69, + 0xb6e45f2981463ad5, + 0xed562c198f296a53, + 0x16e4cfb98d2b57af, + 0x982e7bdbab3e872d, + 0x5b18d64fec31b589, + 0xfb71269fe923b4f5, + 0xe9f582721a28d473, + 0xc1edf7254638d2cf, + 0x35ab6c48763bf14d, + 0x5439e7a9854f21b9, + 0x9d6e54fcb2534f17, + 0xf268d7ecbf165e83, + 0xef65c82bac175bdf, + 0x3a281561fc1a7b5d, + 0x9de1f4c32b1e7ac9, + 0x6719cd465b21ca37, + 0x24af3e176914d8a3, + 0xb74e8c2ba937e821, + 0x6b542f1ba419f57d, + 0xd8ca476cb42c15e9, + 0x6a3fc4eed31f2457, + 0x7e46c31edef164c3, + 0xa6d3ef432ef68341, + 0xec651d943cf6719d, + 0xa51efcd43ad87ef9, + 0xc6a8fbe548fcae67, + 0x6bf3cd5876efacd3, + 0x2d738c6ba7f3ec51, + 0x3589ca1cb3e4f9ad, + 0x1598b76fe4f81a2b, + 0x794acfb213fc2a97, + 0xfea871c651ed48f3, + 0x7eb81a265fe26871, + 0xe15b79d76be375cd, + 0xe723db498ce7954b, + 0xead89f5dc8e9a3b7, + 0x7392465cb8edc325, + 0xa3bcf5dfe6cfd291, + 0xde29546215a2cfed, + 0xf56be28434d61f5b, + 0x49871c3653d82ec7, + 0xf9c5bd4981eb4d35, + 0x689defb87fbe5ca1, + 0x4d6c72ba9dc27a1f, + 0x1fd729cfecd3897b, + 0x16dc7ab1f9c5a8e7, + 0xf75b9cd219dac865, + 0x6518cbf437abd6c1, + 0x87ba2e1546aed53f, + 0x3bf156c986d3149b, + 0x7ed8159cb5d73419, + 0x743b529dc1da4285, + 0x6128b9fdcfab62e1, + 0x241fb7aedb9c6e4f, + 0x5843dfb32d917eab, + 0xc9f684543cb4ad29, + 0xcbf2419438a6bc95, + 0xb1392ae65698caf1, + 0xb513e8f8748bd96f, + 0xd5c8614a938ef7db, + 0xf361587fe5c32849, + 0x936c2d71f1c637b5, + 0x9e53ad2541ca6723, + 0x7c4f63b32e9b648f, + 0x6325aef54c8d73fb, + 0x5ed1f4a87da1b269, + 0x2916ed598a94b1d5, + 0xec6ad7fcb897cf43, + 0xad58279cb467cd9f, + 0x2d87951fe47afc1d, + 0xe4bd6c73248f1d79, + 0x8492d53764923be5, + 0xa291e6d981a75b63, + 0x8d5671e54e6758bf, + 0x124dfa5a9e6b783d, + 0xfe17d26cbc5e86a9, + 0x8ad5279feb92c617, + 0x82693741fa94d583, + 0xc79a62b21876c3df, + 0x427b6fe43679f25d, + 0x9f7a5c27657d12c9, + 0x6197cfeba59f4137, + 0x912ed87cb1825f93, + 0xb84fd7ca9d645cef, + 0xe567d39cbe487c6d, + 0xbeda8941fc4a7bd9, + 0xd89b6ce21c5eab47, + 0xe59762854a61d9b3, + 0xea83cd176a75e931, + 0x6fde83aa9745f68d, + 0x84c5d3ecb45a16f9, + 0xdbf1586dc38d2567, + 0x6ba2e4fdc17f45d3, + 0xf8cba13fef738451, + 0x3ad257921f4572ad, + 0x7839fed54e58912b, + 0x2dc8ef554c3baf87, + 0xe87f2ad7684cade3, + 0x573cb9dba952ed61, + 0xa2c1fe8a9643fabd, + 0x3965a27fe6571c3b, + 0xb685dc21f3492ba7, + 0x369f8bd3236d4a15, + 0x49f21837624f5981, + 0x6aefcb365f3276ed, + 0xb379c2a98e24965b, + 0xefda7c3a9d28a4c7, + 0xb1afe32eda2bc435, + 0x6e42b1fdc84ed3a1, + 0x2b94537ed853e21f, + 0x792148543945217b, + 0x2f8dc63545362fd7, + 0x792c45f9862a3e45, + 0x6ab35f49823c5db1, + 0xe57fb4a98d1e6b2f, + 0xb4591addce127a8b, + 0x6b3f829edc14a9f7, + 0x4369a851fb18c975, + 0xae762414392ac7d1, + 0x7a5cd844381cd64f, + 0x2a5e6d38783215ab, + 0xe463129cb8163529, + 0x7fa2635dc6184395, + 0x2a61953dc42a63f1, + 0x31f9d82badeb716f, + 0xc4f612bba9ed6fcb, + 0x7aefdb832cf1ae39, + 0xad948fe329f3bda5, + 0xd4b3fa9659f7dc13, + 0x786c9be545e8da7f, + 0x124b37a764daf8eb, + 0x46d193ecb4ef1a59, + 0x94352abed4f238c5, + 0x4d3815afe1f76843, + 0x98a5e3d321e8659f, + 0x19a685d43feb851d, + 0x26f1a7954cdea379, + 0x38b5dec87ad1b2e5, + 0xe83b61fa9ae5d163, + 0x4f3e7b1986b5ceaf, + 0x27eb934ba5b8fe2d, + 0x35a9bc81f4dc1e89, + 0x5a74938214be2cf5, + 0xb39ea47764e25c73, + 0x5d2afe3761d459cf, + 0xb2f14da65fc8794d, + 0x16372eb65edc87b9, + 0xa6fdb58a9aceb827, + 0x2fc849bfeac1d693, + 0x625ce48ed7a3c4ef, + 0x38f297a218b7f36d, + 0x168ac39546ca13d9, + 0x31674dc986cd3247, + 0x714eb52984cf51b3, + 0x7fd5462ba3c47f21, + 0x1f82567a9fa46e7d, + 0x79fd13ccbda67ce9, + 0x8ab94251fd9bac57, + 0x7c964a22198ebac3, + 0xe83f426659b2ea41, + 0x8df3152546a3f79d, + 0x264371ca96c7281b, + 0xc8794ebba4cb2687, + 0xae39d86cb2ac46e3, + 0x37c625eed2bf7561, + 0x37a816bfef9273bd, + 0x4bed35621fa6923b, + 0x7e6a8bc43e98b1a7, + 0xc7e253854b79aef3, + 0xb9a3d6e6598dce71, + 0x63ca52b98671fbcd, + 0xf1b7de8dc7951d4b, + 0x8d96b72fe4962cb7, + 0x5d6e4821f39a4b25, + 0x7d9abc53238d5a91, + 0x2cbe8164318e57fd, + 0xb376e5a54f82976b, + 0xefb591876e84a5d7, + 0x6372b19bad89c645, + 0x9d346a8dc97ad4b1, + 0xd83c1fecb87cd32f, + 0xa87291c1f793128b, + 0xce185bd3289531f7, + 0x46e3b8d324983f65, + 0x47d3a19763795ec1, + 0x6be2c199817b6c3f, + 0xe5968b287e4f6c9b, + 0xe735d9fdce63ab19, + 0xb158a79fed64ca85, + 0xa486c9b1fa57c8e1, + 0xc7bf9562194ad75f, + 0x4b398f63274df5cb, + 0x65fc28987a812639, + 0xcfa5d74cb78634a5, + 0x36715efdc4897513, + 0x7e2dfa4dc15a627f, + 0x962c54bbaf4c71eb, + 0x2f58934edc3e8f49, + 0x5c8d2a721d42aeb5, + 0xb12df6854b56cd23, + 0x2d5e87b54936db8f, + 0x4ebc3a165638e9fb, + 0xe8621bcba74e1b69, + 0x69478d3dc76139d5, + 0x2f7ab84fe2746953, + 0xcf341d6fe13756af, + 0x9ae4dc24314a862d, + 0x69b472143f2da489, + 0x149db2e76c2ea3f5, + 0x14c8a6ba9c54d273, + 0xa3e47bc98935d1cf, + 0xcb57836ba827ef3d, + 0xe16c39aed63b1fa9, + 0x71ba3561f64d3e17, + 0x174d369327415d83, + 0xcd7239a764235adf, + 0x6af9c5b981267a5d, + 0x92efd8a65f1a78c9, + 0xc9b5a2198e1db937, + 0x827a36ca9b1fc7a3, + 0xa5169b8edb34e721, + 0xb56319dfe915f47d, + 0x7db1f5843a2814e9, + 0x8bd7c957691c2357, + 0x3ae746f9871e52c3, + 0x1c284e5cb7538241, + 0xe568c92ba2136f8d, + 0xf231e7a98ce47df9, + 0xf5a2719cbcf8ad67, + 0x2a691fcfe8f9abd3, + 0x7ca9583329fedb51, + 0x2c6a851437e1f8ad, + 0x981a5f2768f5192b, + 0x2e58cd1ba5f62897, + 0xed25146a95ea47f3, + 0xea7f918cb3fd5671, + 0xb168e7fba1ef64cd, + 0x479235eedfe2934b, + 0x4e2b69c21fe5a2b7, + 0x9fa6cb154de9c125, + 0x2e81963549dacf81, + 0x563d9c85469abced, + 0x4128cd5a98d21e5b, + 0x5e9d1bfba6e42dc7, + 0xec8bf79ed6e84c35, + 0x45c62d91f3e95ba1, + 0xef1cab8323dc691f, + 0x42acf7d431df687b, + 0x9e2f83154fc2a6e7, + 0x74d12f398ed4c765, + 0xe254baf87ab8d5c1, + 0xf4ba2d5a98bad43f, + 0xe5fd8a7dc6adf29b, + 0xb7e94121f8d24319, + 0x7ced941329d64185, + 0x2b8c614434b75fd1, + 0x1edf4b7652b96d4f, + 0x6ba289e6519c6dab, + 0x18e4dc276eaf8c29, + 0x325f47698ea2cb95, + 0x6bf7c81edba5c9f1, + 0x74ab6d9fe9a7d86f, + 0xaef54cd21789f6db, + 0x98f2a75438be1749, + 0x1f46e58878c136b5, + 0x6eb38fcba8c57623, + 0xed69f84ba2b7638f, + 0x468729edc1a972fb, + 0x9f7d1eadcf8da169, + 0xb574f96edb7e9fc5, + 0x95a4bf221d92ce43, + 0xe71b8fd32a74dc9f, + 0xa2d19bc54987fb1d, + 0x3627a4f6568b1c79, + 0x21d6aefa968d2ae5, + 0xb659823ed7b15a63, + 0x8549f72ed29357bf, + 0x9ce53161f1a6873d, + 0x1cad9483217b85a9, + 0x1294a6743f8db517, + 0x23b86df65d7fc483, + 0x374ec2f76a73c2df, + 0xb853e6da9a86f15d, + 0xfc42836eda7821c9, + 0xe34685aed68b3f27, + 0x41ca3921f57d4e93, + 0xca1f4de324715bef, + 0x5b8adef542837b6d, + 0xdfba97e541657ad9, + 0x13d2bf876f59ba47, + 0x2ab859c87e5dc8b3, + 0xbf7194cbab6fd831, + 0xa5f8d13dca62f58d, + 0xf5b47a3fea7615f9, + 0xf8b75c221b8a2467, + 0x4ab817f3287b54d3, + 0xde34b1fa968e7351, + 0x1a65d87a946271ad, + 0x8fb1d93ba2648f1b, + 0x4f32e78cbf35ae87, + 0x4926d5fcbd48ace3, + 0x9624e8a1fa4bdc61, + 0xa63bf2c2183fe9bd, + 0x218a39665c641a3b, + 0x2ae578176b4529a7, + 0x1a582f4cb86a4915, + 0x1356fd7cb64c5781, + 0x9bc1524ba23c65ed, + 0x7928af3fe261945b, + 0x1a75983fef24a3c7, + 0xb57e2fc21f48c235, + 0xa13df8465e49d2a1, + 0x8edf61354829befd, + 0x741b6cf6582dfe6b, + 0x9cf26bdba9432ed7, + 0xf69e4badc9273d45, + 0x91876a4fe6385cb1, + 0x53ad826fe43b6a2f, + 0xeafc4562132e698b, + 0xafbe13965231a8f7, + 0xd8ae1c376f13c875, + 0x7e9b2fa98e27c6d1, + 0x1963b7598b19d54f, + 0xe14fd5ca981cf3ab, + 0xae9645feda3f1429, + 0xae753141fa134295, + 0x3f278da5493762f1, + 0xd2cb76a434186e5f, + 0x4e3a268653196ecb, + 0x6c1582a8721e8d39, + 0xb4ca5f376def9ca5, + 0xf5a4328a9cf4db13, + 0x47d9e5acbae4d97f, + 0xfd538eadc8d6f7eb, + 0x3ad9b6432afc1859, + 0xa97d5b1438fe27c5, + 0xd42c763989f16743, + 0x1cb3f6a985e3649f, + 0x9f38e1bba3f7841d, + 0x3294a8ddc1fba279, + 0xf21d5baa9fdca1e5, + 0x42f79b5edacebf53, + 0x6b7c235219b2cdaf, + 0x5fd8ac7439b5fc2d, + 0x6f3d9a854ae71d89, + 0x5e3adf1767da2bf5, + 0xcf3d857a96de4b73, + 0xc53f264ba4d158cf, + 0x1e3a9fbdc2e3784d, + 0xa2365be1f1e586b9, + 0xb2e1695431eab627, + 0xdb1f9a732fbdc593, + 0xdb3982a54a9db3ef, + 0x19b6edf87ab3f26d, + 0xf162e5d98ac612d9, + 0x6b254d3dc9da3147, + 0xa7169bced6cb4fa3, + 0xbe14c5d1f5bd6e21, + 0xe68ba41324b16c7d, + 0xe65a297542c37be9, + 0x61fde73541d6ab57, + 0x38acb1d65fa8b9c3, + 0xc61b32a87eacd941, + 0x5ca2d4887a8fe69d, + 0x52c7d16feac4271b, + 0x4e5631c1fac62587, + 0xd78c6a2218b945e3, + 0x278945d438bc7461, + 0x9fb2ea16549e62bd, + 0xb96d532985c2913b, + 0xcd596e3981b3af97, + 0xdf6713ea9e86adf3, + 0x61c83fecbe89cd71, + 0xedb95481f869eacd, + 0xf32c5b42197efa4b, + 0x87f6bad54c932ab7, + 0x23e1c8b769b74a25, + 0x5a3f48d876ba5891, + 0xf7b1cd8a938a56fd, + 0xde81694dc29e856b, + 0xaf4c9d1fe291a4d7, + 0x8c9d7f1fef96c345, + 0x6e5791c32f87d3b1, + 0xa952cfd54c79d12f, + 0x65ed9a24395aef7b, + 0xb8f93ec6596d1fe7, + 0x4cf367acba923e65, + 0x1453c9acb7865dc1, + 0xf3ec1b9ed4786b3f, + 0x3e849d51f25c6a9b, + 0x5e9dafc3236e8a19, + 0xa528cf654271c985, + 0x2b14af865f64c7e1, + 0xf6ced1598c47d65f, + 0x9d58e4287a58f4cb, + 0x9372da4dcb7d1539, + 0x96b845ced97f23a5, + 0xa43b7c61fa957413, + 0xa7bf81c32985617f, + 0x5b7fa6e323476fdb, + 0xc8241757625b8e49, + 0x2e5db898714e9db5, + 0xbd65f84a9f61dc23, + 0xfe5c328a9c43da8f, + 0xa7fe125dca35e8fb, + 0x3b46ed91fc4b1a69, + 0x6739c4d21a4c28d5, + 0xb31a68432a6f4853, + 0x215f34c8784265af, + 0x8f5de36ba746852d, + 0x63185eddc247a389, + 0x3ba895edc14ba2f5, + 0x64d7eafcbf4ec173, + 0x4659af3eda31cebf, + 0x264b3df21b24fe3d, + 0x917b32854c361ea9, + 0x3d987eb76b4a3d17, + 0xc32a84b8792d4c83, + 0xf41c59d9862e49df, + 0x1b29754dc632795d, + 0xd57c382fe32487c9, + 0x864e93c1f129b837, + 0x1953cd65412bc6a3, + 0xb39cdf265f3ed621, + 0x1a8f4ec76c21f37d, + 0x2976fd398c2513e9, + 0x45321d7cbc193257, + 0xe5afb96ed92a51c3, + 0x52ce981ed82c6f31, + 0x43987fedc41f5e8d, + 0x2c5aef6435127cf9, + 0xf23e6d765314ac67, + 0x38c1b4576217bad3, + 0x94c5dfb76ef9da51, + 0xd6e1724659fbe7ad, + 0xcbd245a989def72b, + 0x9f26e5bedbf32697, + 0x5a13f4bed9e746f3, + 0xe591bda329fa6571, + 0xe31549a325fa63cd, + 0xef982d4765fe824b, + 0x916ab3d984f2a1b7, + 0xc86f2daa92e4bf15, + 0x5ec7fb4a9fd6ce81, + 0xf5e2b13989a7cbed, + 0x169b5a4fe8dafc5b, + 0x786b94d329df1bc7, + 0x523bd7176ae24b35, + 0xf6859ec548e659a1, + 0x4de568b875d9681f, + 0x84cd32ba93ec867b, + 0x7d4163cba2cd95e7, + 0x2816759ed2e1c465, + 0xc65ba9ffefb5d4c1, + 0xeb4876921eb7d23f, + 0xe26bd7a43dc8f19b, + 0xa15efc776bcd3219, + 0x4cf8957769be2f75, + 0x26dfe3ba98b35ed1, + 0x3b67f49ba7b56c4f, + 0x6d2f35afe3d76cab, + 0x6843e791f3dc8b29, + 0x59e7fc2212ceba95, + 0xc8f61ab653b2c8f1, + 0xdb53c9154ea3d76f, + 0x798623c54c96f5db, + 0x96da7fc98dcb1649, + 0xd8231efdc9ad24b5, + 0x57ef8b3ed9bf6523, + 0xf391278fe7b3628f, + 0x394fc87326a571fb, + 0x1eb459c323b78f59, + 0xb3fe79a5428a9ec5, + 0xbf41e968719ebd43, + 0xb7ae89576e71db9f, + 0xf7e354ca9c84fa1d, + 0xc2d4678feda61b79, + 0x7b4361e1fb8a29e5, + 0xf5b398621bad4963, + 0xbe5c49f3278e46bf, + 0x216ecb4657a2863d, + 0xb89e3c4873b584a9, + 0x2938db1dc3a9b417, + 0xf178eb4ed19bc283, + 0x2a6d357a9e6cb1df, + 0x9742defdcb71ef4d, + 0x7d8baf132d741fb9, + 0x5fd63b754c983e27, + 0xbcd874165b7a4d93, + 0xeabf9436576b4aef, + 0x6572ebaa947f5a6d, + 0xf215e36dc46278d9, + 0x562f9bafe285b947, + 0x24a593b1f168c7b3, + 0x715edf25428bd731, + 0x6c8de1332f5ce48d, + 0x73f89ec76d7214f9, + 0xbd7916cbad952367, + 0xe91c5b6bab7852d3, + 0x1b3e942eda8b7251, + 0x49a2d61dc64b5f9d, + 0x4e52f98ed45f7e1b, + 0x6a5fbde21452ad87, + 0x1b3cadf54265abe3, + 0xea8b3d187258db61, + 0xd9c12f365f39e8bd, + 0x492c51f87c4df83b, + 0x6a589e3dcd5128a7, + 0x539a24dfec764815, + 0x84936b11fb495681, + 0x64fe9b32183964ed, + 0xd7a3c613274d835b, + 0x4b2c8a37654f92c7, + 0xce3f297ba674c135, + 0x71b928dba245cf91, + 0x617af4b98e26bcfd, + 0xf8c17bdbac29fd6b, + 0x4329a6e1fa3e1cd7, + 0x8bcf67e32d613c45, + 0xdce1b8776c345ab1, + 0x8fe9c2765a37692f, + 0x41ca83ba952a678b, + 0x1e65b98ba42c96f7, + 0x9b1a27edc32fb675, + 0x7f5b619fe243c5d1, + 0x3d9ef5adce16d34f, + 0x2167a9c43e17f2ab, + 0x7314cd976e4c1329, + 0xdeb985287c2e3195, + 0x291c57698a325fe1, + 0x4269731ba9136d5f, + 0x6cf89deba7156dcb, + 0xf9625c7fe51a8c39, + 0xa4e27511f31d9ba5, + 0xb1e738a5452fca13, + 0xcadf23e65312d87f, + 0x7f25c9d54cd3f6eb, + 0xfbac89176df81759, + 0x7c2ad9498bfa26c5, + 0x98da574cbafd5643, + 0x37d4cf2cb7de539f, + 0x2ba4fc8fe7f4831d, + 0xb69ae3d326f5a179, + 0x7e598cf323e79fd5, + 0x3fe127a762fabe53, + 0x24cb671651edbcaf, + 0x235961887ec1fb2d, + 0xb921d74bade41c89, + 0xeb1653adcbd72af5, + 0x27c16ab1f9eb4a73, + 0x86425df218db47cf, + 0xa87534e328cf674d, + 0x6c1eb23546e285b9, + 0xf8bad3ca94e6b527, + 0xf1e6b24ba2e8c493, + 0x3b6f254981c9b2ef, + 0x7e6adfca9face16d, + 0x985deab1fec321d9, + 0x27d9e6f21dc52f37, + 0x61b4f3932bc74ea3, + 0x179fe4c659ca6d21, + 0x6a3e178546ac5b7d, + 0xbf2d1e3874bf6ae9, + 0x9173d2bdc4d2ba57, + 0x3db56acfe2d5b8c3, + 0x3ac91521f2c9d841, + 0xf1d4967321bae59d, + 0xbf1cea543e9df51b, + 0xd29ceb376ec12487, + 0xae2467598cb654e3, + 0xc4d5f69babc97361, + 0x9f5a378dc7a961bd, + 0x51ac46eed59c7f2b, + 0x475b6e8ed3af8e97, + 0x63c274a21592acf3, + 0x72e1f53543a5dc71, + 0xa391bed54186e9cd, + 0x81b6de465e7af94b, + 0xc31289576d8e19b7, + 0x2f8ae93dcdb14925, + 0x7acb35dfecb45791, + 0xdf79c8afe89765fd, + 0x9cf82532179a846b, + 0xbf375e83258c93d7, + 0x1c82e548769fb245, + 0x93615ad98594d2b1, + 0x8cb31e6a9285ce1f, + 0x72be15aa9d56fe7b, + 0x45a81e9cbc6a1de7, + 0xc7a36591fb8e2d65, + 0x19d2bca43d825bc1, + 0x1687be432b846a3f, + 0x8791fb443a75689b, + 0xe6af5248756ba819, + 0x74e9b26ba36db785, + 0x71b845cba37fb6e1, + 0x9e5d18bdc182d45f, + 0x5e18cf4ede65f3cb, + 0x6e93a7132f7a1439, + 0xb68c7ae54e7c32a5, + 0x35edb6887c8e6213, + 0x35612fa98a715e6f, + 0x6bf7c13a98536edb, + 0x21eabf5dc7568d49, + 0x5c214a6fe3489cb5, + 0xe795ca41f46dcb23, + 0x25b63a42124ec98f, + 0x5e6192b54152e7fb, + 0xd1529b687f451869, + 0xe975d4298e4927d5, + 0x7638fc1bad6c4753, + 0xf861c42cb93d54af, + 0xad25b31fea61842d, + 0xb9136271f754a289, + 0x4edf63132847a1f5, + 0x8b3fdc532549bf63, + 0xabdf28165239adbf, + 0x8f523bd8714fec3d, + 0xfa1569c98f431da9, + 0xf346dcacbe463c17, + 0x6ba8d15fed294b83, + 0x51c68d3fe92a48df, + 0x4d7ca5921a2e685d, + 0xfec3b9d54a3186c9, + 0x45a1bfe98924b637, + 0x4f8b2a7a9627c5a3, + 0xa1dfc86cb64ad521, + 0xb4c5261ba13be27d, + 0xc8471b5bac2df1e9, + 0xb94527a1fe243157, + 0x15ef3b832d164fb3, + 0x3a874dc65c296e31, + 0x5f982ea5491a5c8d, + 0xfa4c9b16571d6bf9, + 0xefa748ddc821ab67, + 0x934e15adc614b9d3, + 0x29ba38dfe427d951, + 0x5d7863b1f218e6ad, + 0xa1bd7655431cf62b, + 0x6cf89d143dfe1597, + 0xd329fcb87ce145f3, + 0xae4b7d3a9cf56471, + 0x45efd29989f762cd, + 0xda6b37edc7fa814b, + 0xe19c275cb4ec8fa7, + 0x438dabfdc4dfae15, + 0xbde5a4f325f3cd81, + 0xa92468d432f4caed, + 0xaf7cb2d541e7fa5b, + 0x39a21d765feb1ac7, + 0xc67f5b298cde2a35, + 0xfd72398cbce258a1, + 0xe4761a8dcad4671f, + 0x71b64a51f9e6857b, + 0x4dfb63e216da94e7, + 0xcf79d48327edb365, + 0x31a9de2765dfb3c1, + 0x7e5f32a985c4d13f, + 0x3bc21a8871c4ef8b, + 0xa42f5cea9db81ef7, + 0x12e547bbadcb2e75, + 0xcb829561f9ae4cd1, + 0x3af78e632ac16b4f, + 0xac73d49328d369ab, + 0xc75d21a547d68a29, + 0x95ae7b4764dab895, + 0xe7159af984acb7f1, + 0x73cad18a92aec56f, + 0x14697dfdc1a2f4db, + 0x3815964fefc71549, + 0xcbe457321fc923b5, + 0x7b9234d65ebc6423, + 0xbd9831254bad518f, + 0xab3742f658916feb, + 0xe3789dbba7b38e59, + 0xac2f564cb4a69dc5, + 0xd42fba9fe5a9bc43, + 0xcab48f1fe27bca9f, + 0x834e5d63238fe91d, + 0x81a4e32652c31a79, + 0xed368f154fa628e5, + 0xb1ed25987eba4863, + 0xd453f1887c8a45bf, + 0x91d7326cba9e753d, + 0xb8793a2fe7b183a9, + 0xb61e9341f8a5b317, + 0xfa175e6326a7c183, + 0xea7bc3f32367aecf, + 0x1a46d826527ace4d, + 0x84cde976516efdb9, + 0x94e3bf1baf943d27, + 0x6edf532cbe864c93, + 0x435d716dcb6749ef, + 0x1a3c8471fa7b596d, + 0x3ed4ab621a5e67d9, + 0x514cbf243a91b847, + 0x723c4a165784c6b3, + 0xe793fbdba598d631, + 0x1379e42ba269e38d, + 0x38fdc9bba16be2f9, + 0xf8a7295dce8f1267, + 0x7168e431fe8451d3, + 0x14a859b32d876f41, + 0x5934c7d32b475e9d, + 0xd956ba25495a7d1b, + 0x4fc7b186564e9c87, + 0xbd3c861a9761bae3, + 0xdea4657dc574da61, + 0xf84d97edc245e7bd, + 0x56f8132fe159f73b, + 0x7d9ac464325d16a7, + 0x29367de54e6f3715, + 0x7f6d43ea9e736581, + 0x94562c198b4563ed, + 0xb5e3129bac49825b, + 0x17ae93fed84b91c7, + 0xeb3a928dc74daf25, + 0xa53c7d21f652ce91, + 0x84a752f21543cbfd, + 0x5d72a8b54235fc6b, + 0x349b281762491bd7, + 0x21ed3f598f3d2b45, + 0xc1aef4698d3f49b1, + 0x98fc354cbc43682f, + 0x937b214fec24768b, + 0xfb8d269fea2895f7, + 0xb4a38652192cb475, + 0xd93c21e6573eb4d1, + 0xfd714a298751d24f, + 0x29157ed98534f1ab, + 0x6971d82dc4583129, + 0x48c37a1cbe1a2f85, + 0xbe65c39bac2b4de1, + 0x926514aeda1e4c5f, + 0x874e69f43d126acb, + 0xe1b7ac654c158b39, + 0xb7f5e9254817b9a5, + 0x69b5a7e9872bc913, + 0xe518dbfa941dc67f, + 0x9274c8bba421f5eb, + 0x7b85ac3fe3241659, + 0x7eab315edef724c5, + 0x54ead3921efa6543, + 0xfe6d71c43ceb529f, + 0xa134dfb65afe721d, + 0x6dce7b465ae18f69, + 0xab5197c987f39ed5, + 0xc89e523ba6f7bd53, + 0x7b1845aa93e7cbaf, + 0x9a85723dc3fbea2d, + 0x26a9345212defa89, + 0x4f759cb761e329f5, + 0x8a731c265fe64973, + 0x9486b1365bd846cf, + 0xaf4739598aeb764d, + 0x31d68f2ba8de74b9, + 0xb148265ed9e1b427, + 0xb8ec5691f7e5c293, + 0x6843cfd325c6b1ef, + 0xc735489323b8cf5d, + 0xbfe1ad2542bafec9, + 0x4c6a13b982cf1e37, + 0x9af315b98fc24da3, + 0x168b749baed76c21, + 0x641f9a2febc85a7d, + 0x3e59b781f7cb68e9, + 0xdf56472218cea957, + 0x61b537f548d1b7c3, + 0xcd59ba8768c5d741, + 0x1ca3d42873b6e49d, + 0xad956fc983c9f41b, + 0x3c5d9a8cb2cd1387, + 0xd53a129cbdaf42e3, + 0x42d15871fec47261, + 0x3f75d8b21c945fad, + 0x6f729d843ca87e2b, + 0x97fcaeb436ab8d97, + 0x3b897166568d9bf3, + 0x6fd3c8aa96a2db71, + 0x7bdce48ba493e8cd, + 0xbe791f2ed2a6f84b, + 0xb93285e1f2ca18b7, + 0x291d56e541bd3825, + 0xa8ed9f643eaf4691, + 0xb8fde2c65c9264fd, + 0xa1f48de87da5836b, + 0x1a429fc76ba892d7, + 0x4f5c821ed89cb145, + 0x6df873adc57dbfa1, + 0xa6b29d8fe582cd1f, + 0x2e74ba321483fd7b, + 0xec2bfa6543961ce7, + 0x6df59428719a2c65, + 0xef3b84c76f7d4ac1, + 0xa45c3d698c7e593f, + 0x75a1d9bdcd82679b, + 0x25d9c43fec85a719, + 0xa2946cb1fa79b685, + 0x1fb97463287ab5e1, + 0x391857f3267dc35f, + 0xcbd724a76571f2cb, + 0x7fc5a93cb5a61239, + 0x1e48fb2dc29831a5, + 0x469857cbad694ef1, + 0x78d3954bac5b4d6f, + 0x8cd4769fe94f5cdb, + 0x6c3ae2f21d628c49, + 0xc18e5d632c649ab5, + 0xe3ad69b65968ca23, + 0xed2583f7654ac78f, + 0xabe59629834cd6fb, + 0x527f146ed4821769, + 0x39ca46bfe18426d5, + 0x364b98ffef794653, + 0x832d96a21e4953af, + 0x3b81c6254e5c732d, + 0xa36b49765c4f7189, + 0x9625a4d87a429fe5, + 0xf27d3b6ba945be63, + 0x512c437a9536acbf, + 0xa8471bedc549eb3d, + 0xb271d89fe23dfba9, + 0xafb93cd545623b17, + 0xd2948c6871654a83, + 0x6319aef65e2647df, + 0x62f53e998e2a675d, + 0xadeb2c998b2d75c9, + 0xa493b87dcb2fa537, + 0x62f4359fe952c4a3, + 0x7c216be1f957d421, + 0x3e1795b32638e17d, + 0xec742f543428efd9, + 0x9deb26c9853d1f47, + 0x6f3d2e5a92514eb3, + 0x8163decbaf256d31, + 0x5d87bfcbae165b8d, + 0x2fab5e4edc186af9, + 0x687e3451fb1d9a67, + 0xbf3d56c3291fa8d3, + 0x213f54876a23d851, + 0x3c1f7ed76714e5ad, + 0x6b57c84a9618f52b, + 0x5c981d3cb52c1497, + 0x93146d7cb51d24f3, + 0x1a437fecbdef5371, + 0x165297ffebf361cd, + 0xe8a423b21ce57f3b, + 0x18be73f32bf68ea7, + 0x2a89c5f548fbad15, + 0xecd37b2656febc81, + 0x28693ad875f1c9ed, + 0x1bf8ed9ba4e3f95b, + 0x64a8b92ed3f619c7, + 0x4d5af31fe1fb2935, + 0xfeb186c432fd47a1, + 0x8e94bfd43dce561f, + 0xc6f78b165de2847b, + 0x7432ae876bd593e7, + 0xb16fca998ae9b265, + 0x54b837ea97eab2c1, + 0x21b68e5a95acbe2f, + 0x8396bfaed4c1fe8b, + 0x1759ce8325c41df7, + 0xb9adf7c543e82d75, + 0x5da183b762e94bd1, + 0xdb78c3276ebc5a4f, + 0xa174f9e76dcf58ab, + 0x8a5192ecbcd3a829, + 0x9d185f2fead4b795, + 0x3dfa1c4fe7c8b6f1, + 0x28b45fa217bac46f, + 0xc537db83259ce3db, + 0x9f217d4987d21349, + 0x67d2feca94d632b5, + 0x8d324f7cb4d96123, + 0xfd1e27b98da94e7f, + 0xd71a63fa9c8a5deb, + 0x6a51b94febaf7d59, + 0x35f24cd21da29bc5, + 0xa1fcd93329a6cb43, + 0xb21a4df435a6c89f, + 0xe295dc17659ae81d, + 0xca321f6983adf679, + 0xba14f7ddc4b127e5, + 0xa132869fe1c54763, + 0xcb6957aede9754bf, + 0x93528bf21f9a743d, + 0xa5efc7943e8d72a9, + 0x631de7f65c9fa217, + 0xdc128e576a92bf73, + 0x45adc6e98674adcf, + 0xcb25864ba587ec4d, + 0xb81f9e5ed368fcb9, + 0xa472db31f49e1c27, + 0xf8a7d53325a14b93, + 0x964ae8f6519348ef, + 0xad1be6943f97586d, + 0x2731e6b54e5a76d9, + 0x3db6fa2a9c8da647, + 0xdab859fdc97fa5b3, + 0x15863d7fea94d531, + 0x549ebc11f675e28d, + 0x4c6e3ad32567e1f9, + 0xa6df2355459c2167, + 0x48732bf7647d2fc3, + 0x95142dbba3926e41, + 0xab7951398f635c9d, + 0xcd15264bae567c1b, + 0x4f37169fed4a9b87, + 0x95ca2611f85ca9e3, + 0x65fe7ca32a5fc961, + 0x267ad9543852e6bd, + 0x86c23e154875f63b, + 0x1382e95cb46915a7, + 0x3a9721fcb48c3615, + 0xbdfa659dc27e5481, + 0x1375f64cbf5162ed, + 0x6e2b1831fe64815b, + 0xa94758221d358fb7, + 0x52ed87143c49ae25, + 0x916a7db6584cbd91, + 0x172d3bc6563ebafd, + 0xe7bc2ada9742fa6b, + 0x3d75a46dc6451ad7, + 0x6f12793fe3692a45, + 0x27bae5d1f25c48b1, + 0xb2d497f4314d572f, + 0x3d18a9654f31758b, + 0xeb41a5776d2394f7, + 0x6125873a9d28b375, + 0x9a5fe1798a49b3d1, + 0xdf71e85ba83bc14f, + 0x425e6cdba52edf9b, + 0x91876acfe7542f19, + 0x538ca6b217362e85, + 0xfb7c184765384ce1, + 0x295436d8712a4b5f, + 0xa4efc7276f1e59cb, + 0xad165f7cbe218a39, + 0x4e3a5b8dcd13b8a5, + 0xfa81594feb27c813, + 0x8f2945cfe819c57f, + 0xfbe1a373271ad4eb, + 0x2983d165471ef359, + 0xb324751a981423c5, + 0xcea9d81cb7186243, + 0x5d7c13ecb328519f, + 0x2f85ea487cd85efb, + 0x342d516babfc7e69, + 0xc29471fcb9ef8cd5, + 0x38a2dc521af2bc53, + 0x8a7961f327e4c9af, + 0x96b5a37546f7e92d, + 0x3b79df4654ebf789, + 0xb5a342da94ed18f5, + 0x7a5ef24dc5f14873, + 0x64f91cecb1e345cf, + 0x97f6458dcfe8754d, + 0x2cba86d21fea73b9, + 0x6b37d8c54ceda327, + 0xd2be6f765adfb193, + 0x6974f1e657b2aedf, + 0x3f2596d987b4ce5d, + 0xbd7e943984b6fdc9, + 0x5d62183dc5eb1d37, + 0x974e1b51f4de2ca3, + 0x6a9fbe3545e36b21, + 0xae951db541e3597d, + 0xc27a4de43fc567e9, + 0xdb7c28954edba857, + 0xc2a46b3879bda6c3, + 0xdc562bfba9bfc641, + 0x7f13ad2dc7b2e39d, + 0xf2a835dfe7c6f31b, + 0xd5b682a436da1287, + 0xc27f1e8656cb41e3, + 0xe82b4d9873bd4f51, + 0xbe21c9d872b15ead, + 0xb314ed698fa47d2b, + 0xc34856ebaeb58c97, + 0x8ab5c31edcb89af3, + 0x35471ce1f89dca71, + 0x5e6b39d2168fb7cd, + 0xf6ac278438a2f74b, + 0xdaf9ec6548c516b7, + 0x8acb742a96ca3725, + 0xe72dfc6ba3bc4591, + 0x93b4c61ba19c53fd, + 0xa76ec49edfa1826b, + 0x16eca4d1fea491d7, + 0x2cd4a6f21d97af35, + 0xd48eb1c43c78bea1, + 0xe238a655487abc1f, + 0xe97cb535456fec7b, + 0x9378ec1ba6931be7, + 0x1b698afed4a72b65, + 0x67dc58afe3a849c1, + 0x4f68513fe19b583f, + 0xd35e47b3218e569b, + 0xc1b953654f82a619, + 0x245a3f776e93b485, + 0xef9c58376c87b4e1, + 0x3275cbd98a79c25f, + 0xf26ba78a976ae1cb, + 0x5e974a8cb56def29, + 0xf73d984fe6832f95, + 0x7cb93fa325864df1, + 0x25e4687432784c6f, + 0x135c67b541695adb, + 0x25e9f7876f5e7b49, + 0xa4d921398e61a9b5, + 0x84369cecbd75c923, + 0x72a861ceda45c68f, + 0x2478b3ffe748d5fb, + 0xf47b2ce2185cf469, + 0xafb1ec54387f14d5, + 0xf57e831ba8926453, + 0xe8b5c47a937652af, + 0x7182e6ccb369712d, + 0xc7b31debae3b6f79, + 0x4bf239ebab3c8de5, + 0xec2684d1fc51bd63, + 0xfdc74e621943cabf, + 0xc4763f932946ea3d, + 0x813cf5254637f8a9, + 0x286ab54a985d2a17, + 0x3c91da5cb65f2983, + 0x23517a4cb35246df, + 0xc31a768fe134765d, + 0x8152d3ffef2874c9, + 0x3e5f26c21f2ca437, + 0xf2d914e65d4eb2a3, + 0xd14ae3298c64d321, + 0x9cd8ab187923cf6d, + 0xefb149398725fed9, + 0x148bfdadc83a1e47, + 0x1329876fe64c2db3, + 0xd48f632fe64f5c31, + 0x6543dbf214325a8d, + 0xe6d983c6512468f9, + 0xde23cf854f18a967, + 0x591a3bf76e1ba7d3, + 0x2c4f5e3a9b2ec751, + 0xfe7cd32cb921e4ad, + 0x3c4eb85ed915f42b, + 0x3574b2a1fa281397, + 0x23b71e86581a42f3, + 0xe283c457683d5271, + 0xe71daf47631e4fbd, + 0x7f4ec52a94127e3b, + 0xe4f725b76ef38da7, + 0xc4813a7a9df7ac15, + 0x85193fbedaf9cb81, + 0x1e34d9adc6fab8ed, + 0x5974b68217dfe85b, + 0x351cbae549f318c7, + 0x2e9f3b1769f72835, + 0xe12356a985f946a1, + 0x6354ed7a93eb651f, + 0x38e9576ba1fe637b, + 0x817fc34cbfd192e7, + 0x647bce11fde4b165, + 0xb4fe67d32cd6afb1, + 0xd97af65439c8bd2f, + 0x4528f69436caed8b, + 0xfb683d5545adebf7, + 0xcf978dbba8e32c75, + 0xc2e1859cb5e64ad1, + 0x3e5a679dc2d8594f, + 0xa3c5eb21f1ec57ab, + 0xcf9a814431de8729, + 0x47b2df943fd1b695, + 0x2491ec876dc4b5f1, + 0xaf392ed65ab7c36f, + 0x3bfd279767a8e2db, + 0x4369b75ba7bcf149, + 0x6917c52ed7cf21b5, + 0x3129a46fe7c45f13, + 0x28f49c3213b54d7f, + 0x4192ad8432a75ceb, + 0x3a265d9541db7c59, + 0xca3d17954f9e8ac5, + 0xa173e5298eb1ca43, + 0xde5cb7a98ba3c79f, + 0xa64123ddc9a6e71d, + 0x2c697f1fe6baf579, + 0xca76db8328ac16e5, + 0x8b12e7c548bf2563, + 0xd86f5a2876a253bf, + 0xe85c2fba94b6723d, + 0x2d59c37cb2c871a9, + 0x57b6348a9d7a8ef5, + 0xd194e82cbc8dae73, + 0x618ac3bfe971abcf, + 0x26ba5f321a83eb4d, + 0xc4685ba32875fab9, + 0x8431af26589a1b27, + 0xd568cae8768d2a93, + 0xf83d726a948d37ef, + 0x847516edc3a2576d, + 0x683219bfe1a475d9, + 0xbac875ffef89a547, + 0x658c73221f7ca4b3, + 0xecb12f365d8ec431, + 0xe7346b865b72e18d, + 0x172cb6865863dfe9, + 0x928fd61cba981f57, + 0xc457e9fcb6792ec3, + 0x71b5f26fe68c5d41, + 0xfcb2461fe26f4b9d, + 0x34cb618324837a1b, + 0x842cda1431649a87, + 0x21be3fd54f57a8e3, + 0xca2384187e5bc861, + 0x4e1a6238794ec5bd, + 0x1be7f6adca71f53b, + 0x72d6a59feb8514a7, + 0x7a1d8961fa893415, + 0x1a95ed83297b5381, + 0x9bef4c24346b51ed, + 0xaf961e48725e6f4b, + 0x1a4e36ca91528eb7, + 0x2d78a5ea9f46ad25, + 0xc274598bae47bc91, + 0x912e6d4dca38b9fd, + 0x9cb647d1f83de96b, + 0x4af126743b5219d7, + 0xb5cda2643b762945, + 0x23c81e77695847b1, + 0x2fa1d34a974a562f, + 0x1432e97ba23d648b, + 0x3a8d196cb14e83f7, + 0x9f8265cedf43b275, + 0xba2d5c41fe46b2d1, + 0x3fbc6e521c27be3f, + 0x82b7efc43a28de9b, + 0xebd7fa66583cfd19, + 0x12fb3caa9a412d85, + 0x25fdb8cba8354be1, + 0x1d2ba93dc6274a5f, + 0x1ba94f5fe32958cb, + 0xe1396241f12d7839, + 0xe2574894312f97a5, + 0x431a87976f24c713, + 0x92cbd8576d15c47f, + 0xb4cf57976a17d3eb, + 0x2f6c57998a1bf259, + 0xced8526cb93e12c5, + 0x8634b72fea526143, + 0x5821e36ed6134e8f, + 0xde69ac3324165dfb, + 0xa9e6b235431a7d69, + 0xde59b847621c8bd5, + 0xcad513476dfeab53, + 0xd35c24f76be1c8af, + 0x421573ca9af4e82d, + 0xd761af4dcae5f689, + 0xc53f914ed8ea17f5, + 0x45f67ab219fd2673, + 0xc37fb64326de34cf, + 0xd3425e7986f2734d, + 0x3162794983f572b9, + 0x3e51862cb3f9a127, + 0x8a1e2bd87edbaf83, + 0x4ca65bd878ab9cdf, + 0xc8e19b31f9b1ec5d, + 0xde246f9218d3fbc9, + 0x9b2dfae54ae81c37, + 0xd9486b2657e92ba3, + 0xeb2f7d3987ed5a21, + 0xab8fd71a93cf487d, + 0x97f4e15cb3d276e9, + 0x36b5479ed1e4a657, + 0xc4f659bfefd8a5c3, + 0x57fb8da32fdbc541, + 0x786492e43baec29d, + 0x3c41e8976ac3f21b, + 0xe3d2b41a9bd52187, + 0x1a382c7a98b72fd3, + 0xe41af78cb7ca4e51, + 0x89b14adfe39b4cad, + 0x82f976dfe3af6c2b, + 0xd4f6a23213d28b97, + 0xb2719e3541c5a9f3, + 0x6a925c754fb8c971, + 0x89b2ca154e89b6cd, + 0xe16d8cb87a9de64b, + 0xa8739fbedac215b7, + 0x4829c35feac73625, + 0xbc2ea9d1f7c85491, + 0xc2b6ed5216a952fd, + 0x52687a1434ad716b, + 0x3d69b515429e6fc7, + 0x69b5f12981b2ae35, + 0x5f36b1e87f85bda1, + 0xb7a48c3a9d87cb1f, + 0xf56183bedc69ea7b, + 0xe59cb68ed86cf9e7, + 0xa8ce1d443cb12a65, + 0xc97d6fb439a548c1, + 0xde92b1c546a8573f, + 0xf36e4858738a659b, + 0x2c658a3cb3ad8519, + 0xd416f28dc19fa385, + 0x35b74f1dcf84b3e1, + 0x64218cdfed86c15f, + 0x9f7462d21c56dfab, + 0xe5cd61243b6afe29, + 0xaf1e58b54a7d1e95, + 0xe86d2c1879824cf1, + 0xeb18672ba7834b6f, + 0x6152bfddc37659db, + 0x716a3f9fe26b7a49, + 0x8b49e5c1f16d98b5, + 0x2dca8f65417fb823, + 0xd65412843e62c58f, + 0xd4fe68c43c65d4fb, + 0x35eb16a87c58f369, + 0x7f16d5ea9a7b13d5, + 0xa584e12dca8e4253, + 0xea65cb4ed87251af, + 0x94b8c31fe5746f1d, + 0xb58cad7213456e79, + 0x4251876432498ce5, + 0x542acfe8715dac63, + 0x4e86c1f65d3ea9bf, + 0x51bf63798c52e93d, + 0x4986cf3cbc34f7a9, + 0xdbc952afec5a2917, + 0x39c87a41fa5c2783, + 0x28f3adb2184c35df, + 0xbe4529f43961745d, + 0xf9ea5319865473c9, + 0x6539ad1cb458a237, + 0x5fa6b48dc259b1a3, + 0xb69d35887c2a9def, + 0x23a6d5ea9a2fbe6d, + 0xc62a5d9fea32fcd9, + 0x17ab38532c361d47, + 0x8efb39c65a482cb3, + 0xdc5843f8794c5b31, + 0x439eb588762e498d, + 0x29e375acb53167f9, + 0x451a93eed423a867, + 0x9adf5b1fe127a6d3, + 0x2465c98fef2ac651, + 0xf38e57632f1bc3ad, + 0xda974cf65c1fe32b, + 0x95b1f7698d341297, + 0x3f5d2bea9b2741f3, + 0xd76ec82cba294f61, + 0x61d2f75ba6194ebd, + 0xf4b867edc51e6d3b, + 0x7d31e421f4218ca7, + 0xcd265e743624ab15, + 0x2e9c71365326ca81, + 0x258bad143cf6b7ed, + 0x7a21d9854cfae75b, + 0xc3f9eb2769edf5c7, + 0x4198f37dcbf12735, + 0xa8b6132ed9f645a1, + 0x83e4a6ced7e8641f, + 0x39b5cfe215fa627b, + 0xa5c49be434fc81e7, + 0xf92a317762de9f45, + 0xc9843da872f3aeb1, + 0x28ed14a87ed5bc2f, + 0x1ae52cb87ad6ec8b, + 0x9165a74cb8c9eaf7, + 0x8c9a6271f9de1b75, + 0x84b621943ae249d1, + 0x3a49bcd329d3584f, + 0x9ed2a1b434e756ab, + 0x51e2df3874eb8629, + 0xcae29d1982eda495, + 0x1843cada92cea4f1, + 0x9521836baeb3c26f, + 0x2bac3671fca5e1db, + 0x483f5a621cb7ef39, + 0x92a5ef7439cb1fa5, + 0x31de249769bd4e13, + 0xfd8a12b768b14c7f, + 0x94cbd35986c35aeb, + 0xb6ad894dc3d67b59, + 0x561a39cfe2da89c5, + 0x1a276c31f1cdb943, + 0xf57bda9321aeb69f, + 0x9fa5b7354fa3e61d, + 0xdb7589f43db5f479, + 0xf3ed15487cb914e5, + 0xd27e581a9abc2463, + 0x839d2e1ba79d42bf, + 0xfd89137fe8b2713d, + 0xa83b21cfe4b36f89, + 0x694cb52213a68df5, + 0x2e3c8b1542b9ad73, + 0x6abe1985417b9acf, + 0x3b8429765e7fca4d, + 0x37bad4876d72f8b9, + 0xf467e18dcdb61a27, + 0xb26dc78fecba2893, + 0x759bcf3ed78a36ef, + 0xca8e4b32189e456d, + 0x2c6fea8436a174d9, + 0x692dc74986b5a347, + 0x6532bce98497a2b3, + 0x87fad32cb49ac231, + 0xefa7c3198e5abf7d, + 0x4d7136f98a5fcde9, + 0xad674b31fc931e57, + 0x4a8c2e721b862dc3, + 0x5d16e4b43b895c41, + 0x419be5a4376b4a9d, + 0xf59463d9857e691b, + 0x29fad14dc461a987, + 0xd7a31b8dc284a7e3, + 0xf34615cfe298c761, + 0xcaf4716fef58c4bd, + 0xf56ce4221f6ce43b, + 0xb7a24c543c5ef2a7, + 0x735e2af98d964315, + 0xe98b457bac975281, + 0x85d26c1a98574fcd, + 0xa735f94dc75a6e4b, + 0x47289e3dc34e6db7, + 0xd94e1871f471ac25, + 0x38de17b32364cb91, + 0xd921e4a43145b8fd, + 0xbe83cf154f39e86b, + 0x6ca478f65c3bf6d7, + 0x8e542bfbac6f1845, + 0xfb4ae36edc7346b1, + 0x5214acfeda47652f, + 0x94d63c21f749638b, + 0x3728c9b2164b82f7, + 0xc94fa754364ea175, + 0x8e3526a87452afc1, + 0xd2753bc98154bd3f, + 0x82fcb4987f25ed9b, + 0x439c752bad38fc19, + 0xf53bd9cfeb3d1c85, + 0x3c8ea76ed94f3ae1, + 0xa2ebc7d21b32495f, + 0xadc7e614392457cb, + 0x796a84f6562a8739, + 0x69bc1f39842c96a5, + 0xbfd4e92ba54eb613, + 0x6e58921cb241c37f, + 0x8f41c7dbaf14d2eb, + 0xd7ba65cfed27f159, + 0x2fa1dbc54e3a21c5, + 0x9fa248e76b1c4f23, + 0x1d8cf2b6591e3d8f, + 0x6ebd185878125cfb, + 0x4635ac2cb8147c69, + 0xf5147d9dc4178ad5, + 0xbc58263fe41cba53, + 0xcd7341ffe21db7af, + 0xefb1c2365431e72d, + 0xab6c2d443de2f589, + 0x312d7ea54ce716f5, + 0xc6b2d4f98cfa2573, + 0xe2f5bd8878ea43cf, + 0x5fdb473ba8fe624d, + 0xb67e859ed6f271b9, + 0xc13a684ed5e49f17, + 0xefdc897214f6ae83, + 0xab92d1f432e79bdf, + 0xe26a731541facb5d, + 0x6ac982d54dbfeac9, + 0x5c81ed4a9de41b37, + 0x75af418cbce629a3, + 0x3fe8ca7edbea5921, + 0x6b8dc311f8eb467d, + 0xd62a8fc217cd65e9, + 0x7c6ad21438e1a457, + 0xc38b2a4876e5a4c3, + 0x5e8713ca95e8c341, + 0xa594c38872e8c19d, + 0xe3a91bf76d8acef9, + 0x8147d5ea9badfe67, + 0x21b95ac1fab42ed3, + 0x81d93c532bc74d51, + 0xf8d6317328c74bad, + 0x5d2679c547dc6a2b, + 0x89a621e654ce6a97, + 0xb5ea316a95c1a8f3, + 0xf39e5accb3d4c871, + 0xac72314fe1a6b5cd, + 0xa48716eedfa9e54b, + 0x4b6d9ac21e9cf3b7, + 0x42b1f5976dbf1425, + 0xa92f4c887dc45391, + 0xab936fc879a651fd, + 0x42b1af3a97a86f5b, + 0xf382ae7cb49a6ec7, + 0xdb3726fdc4ae9d35, + 0xae429c51f492bca1, + 0xad7689332394ca1f, + 0x542ec6d431a5e97b, + 0xad4827143d69f8e7, + 0xa1c85e487ead1965, + 0xef71cb398b9f37c1, + 0x4df2a73dcba2563f, + 0x6abcf47fe8a5649b, + 0x24ca65b1f6ba8419, + 0xd82a7b62169ca285, + 0xb32958c5458da2e1, + 0x1fc8b4e76381be4f, + 0x3fd1b8a76173deab, + 0x1759fa498e76fd29, + 0xd8e5726cbe7a1d95, + 0x18c69a7eda7c3bf1, + 0x58279f3ed97e3a6f, + 0x6bc3e4221a7258db, + 0x1df3b9732ba57849, + 0xde9854f4346897b5, + 0x25cfde3a958cb723, + 0xd63b54ca926db48f, + 0x1fb46dcba271d3fb, + 0x2435b1adce74f269, + 0x7be6d2a1fe7812d5, + 0x9c4638b32e8b4153, + 0xafb598d32a5b3e9f, + 0x5182f3c5496f5e1d, + 0x642dc1b98a526d79, + 0x4791d56ba7648be5, + 0xe3268aced458ab63, + 0xeac9428ed249a8bf, + 0x3ed821b1f15ec83d, + 0x2c648af43251f6a9, + 0x6cbe98254f652817, + 0x2c98fbd87e592683, + 0x8c9f51287b5934df, + 0x8e4d1a7a9a4c635d, + 0xe87f4d6cb84f62c9, + 0xc64792afe964a137, + 0x2d8f143fe645af93, + 0xc67aedf214369cef, + 0x8bcaf1954239bc6d, + 0x6c783fb6513cebd9, + 0x7d4c5e2a9f521c47, + 0xfc467e1a9e452ab3, + 0x8a6b3d1dcd485a31, + 0x271cfa9feb2a478d, + 0x6dc9b75fe82c56f9, + 0x9a2eb3721a2f9567, + 0xb2385de76842a5d3, + 0x4c713e6a9837c451, + 0xd59e6af98437c2ad, + 0xd4e3bc8a934ae12b, + 0xe2a6b75a9d1cef87, + 0xea76d1fcbc412fe3, + 0x3b65e781fc254e61, + 0x5e31b4c32a164cbd, + 0xcb6328954a196c3b, + 0x57693cd5481d6ba7, + 0xe27cad39872f9a15, + 0xef95a67cb623c981, + 0x1b96fc2ba314b6ed, + 0xb1823f7ed218e65b, + 0x68f71c9cbde9f4c7, + 0x639aebf32efd1635, + 0x71e3fa865cef34a1, + 0x2c45ed987be4631f, + 0xfdba41298af5617b, + 0x6ad748ba95e86fd7, + 0x83b4965ba6fb9e45, + 0x5e72df3ba4fe9db1, + 0xae3572ced4e1cb2f, + 0xf59c7d3212f3ea8b, + 0xb5471fd431d5e9f7, + 0xa76198b54feb1a75, + 0x35b9d2876bec38d1, + 0xe5296bd98ace374f, + 0x2437d56dc9e265ab, + 0x1e4a96cedae68529, + 0xab412e71f6e8a395, + 0x3b45a96326dba3f1, + 0xba8d751434cdb16f, + 0xdc4a271653a1dfcb, + 0xef4ac18871c4fe39, + 0xcea62b798fc71ea5, + 0x74cdba3a9eca4d13, + 0xc5fb37eed9ac3b7f, + 0x61e382ced7af49eb, + 0x7d9b4f221bd27a59, + 0xea1f4cd327d498c5, + 0x6bf381e656d9b843, + 0xaec1947763cab59f, + 0xf9e26da983aec51d, + 0x2ed8c1fcb2c1f379, + 0xa75e24ddcfb613e5, + 0x417265c1fec94263, + 0x6b3518932da941bf, + 0xcab217d43a9b5f2d, + 0x72dfc41437af5e89, + 0x7af9eb1767a28cf5, + 0xf45361ea96b5ac73, + 0x8ed54c6cb386a9cf, + 0xc47f5dbfe28ac94d, + 0xc3615ab1f18de7b9, + 0xe94b3d1654c31927, + 0x8a6197254fb52793, + 0xd1f6c8b54c9735ef, + 0x1e68cb487c9a546d, + 0x1f8d24587a8c63d9, + 0xe6482d1dc8af9247, + 0x75b8142fe794a1b3, + 0xc7b389dfe596bf21, + 0xd256cfb21386be7d, + 0x48b952c43268dce9, + 0x7fc32e95418dfc57, + 0x354c18f87f812bc3, + 0x419ed76bae965b41, + 0x57398dccbc76489d, + 0x97d3b86fec7a681b, + 0xac439821fa5d9687, + 0xb8579362187f96e3, + 0xda317c854893c561, + 0xfd4bec376475c3bd, + 0x6c824aba9478e23b, + 0xf73a52ba926bf1a7, + 0x837a9d5cbf8e3215, + 0x12b68d5dcd824f71, + 0x76431291fa634ecd, + 0x5de6bf321c576d4b, + 0xec86a5132a496cb7, + 0x1b876e35486d9b25, + 0x941c8258765fba91, + 0x4b8c1a7a9452b7fd, + 0xe9a27f8dc254e76b, + 0xeba1723dc148f5d7, + 0x58a3469fef6c1745, + 0x47cebf932f6e35b1, + 0x736e9b265d71642f, + 0x84fceb287d54628b, + 0xb137e26a9b4681f7, + 0xfa87613cb83a9f65, + 0x273e658ba64b9ec1, + 0x657c4a2cb54eac3f, + 0x8ebd63a1f342ec9b, + 0x69dbfae32345fb19, + 0x4b7f13e762491b85, + 0xa9e123576f4b39e1, + 0xf9ea31d87c2d385f, + 0x24ce8fba9d3156cb, + 0xc2ef18aedc248639, + 0x16da2c9feb2794a5, + 0x2e8c1631f84ab513, + 0x9ef64532163cb27f, + 0x21bac395453fc1eb, + 0x8fc36d287532ef49, + 0xefac6b5a92361fb5, + 0xd9b7642baf194e23, + 0xcb36714a9d1a3c8f, + 0xb6437d5dc91d4afb, + 0x419a3851fc217b69, + 0x8b43f6e32b1389d5, + 0x87deba654a17b953, + 0xc1b26ed54518b6af, + 0x9cb5f4d9851bc62d, + 0x614d95eba31fe489, + 0x2a6b54fdc62314f5, + 0xe9473d1dcef62473, + 0x132bc6fedbe742cf, + 0x751ced632cfa614d, + 0x54c789d328ec5fa9, + 0xf867ca5549df8e17, + 0x89ad2b1767f2ad83, + 0xa6d3e84875e49adf, + 0xc1e4b5da93f7ca5d, + 0x43dc579cb2fae8c9, + 0x9d6f478dc1edf937, + 0xcaf6d13654f128a3, + 0xe5dfb3954fe65821, + 0xd9e2a7c43ce8457d, + 0x1bdfac865bda64e9, + 0xc34f26198aed9357, + 0xd874ebfba7df92c3, + 0x4fe63c1ed8e5c241, + 0x7f5d8c4fe3c4bf8d, + 0xfb3da72213b6cdf9, + 0x2ba6ec5432cafd67, + 0xde7b258762be1cd3, + 0x93c74f598fd24c51, + 0xf2a5e9487ec349ad, + 0x48f3d62bacd7692b, + 0x85fc691feadb6897, + 0xa76f8d2fe6bc97f3, + 0xd916fba328cfb671, + 0xb517ecf436a2b4cd, + 0x34265fd875c6e34b, + 0x23a8d57763c8f2b7, + 0x27e195fba4dc1325, + 0xd8f6915bafbe4291, + 0xe3dc642bab914fed, + 0x92d3c1e1fca36e5b, + 0x24dc3ba21ba56dc7, + 0xfe49517328ba9c35, + 0xcf957b15468d9ba1, + 0xf7dac487658eb91f, + 0xb5fc8a7a94a2e87b, + 0x2183cd6cb2a4f6e7, + 0x7125fa4fe2ca1865, + 0xa5c3642fef9b36c1, + 0x4b2873e21e9d453f, + 0xf3bae6154ea1639b, + 0xd18ace576db58319, + 0x5b974fc76cb7a185, + 0xf21c983ba6789fd1, + 0xfed2341a957bad4f, + 0x84735eca936fcdab, + 0xa956f2dfe483fc29, + 0x47d8615323a61c95, + 0x7ce48d1652983af1, + 0xac1327d54e7b396f, + 0xc8f31e765c6e47db, + 0x7982f3dcbda18749, + 0x652178aedc8396b5, + 0xbd14c8ffea98b623, + 0x9dc5632fe569b38f, + 0xe934db22156ac2fb, + 0xc18ad5f4347fe169, + 0xda6c1959869421d5, + 0x6c893f2ba1972f43, + 0x4f6c92798e573d9f, + 0x3512bdca9e6a5c1d, + 0xfc1eab4edb4e5c79, + 0xb2c137d1fb618ae5, + 0x4cda3e521c74ba63, + 0xc7df58b32845a7bf, + 0xc1db26a54659c73d, + 0x5d416e98734ce5a9, + 0x2d3b846ba36ef517, + 0xf62c149ed1942583, + 0x2983f4ecbe5643df, + 0xa41d26b1fe49625d, + 0x59b41f732e4b61c9, + 0x74dac6f43b4d8f27, + 0x54a792876b51ae93, + 0x5f82e91767439bef, + 0x7cab1e6a9735cb6d, + 0x29a538ecb437ead9, + 0x371bc59ed23cfa47, + 0x84b7d96fe25f19b3, + 0xbd9f734762745931, + 0x2ba875f43f25468d, + 0xbce718554d2865f9, + 0xf692ebd98d2c9467, + 0x3bdf24798a2e94d3, + 0x4657921eda62c351, + 0x7689fbdfe734c1ad, + 0xfdb2915fe536df1b, + 0xbc2d65921429fe87, + 0xbafe7c57654b1de3, + 0x152bc749824f3d61, + 0x1ec6a8987f124abd, + 0x512e8bda9e156a3b, + 0xb7e8f93dcd1869a7, + 0x2d1a4c6feb2ca915, + 0x1872e5c1f92eb781, + 0xf568ca443821b5ed, + 0xa9e437b76813e45b, + 0xbd7a49398516f3c7, + 0x9cf1d83ba72b1435, + 0xc64597fcb52d43a1, + 0xa8d457ca9ced521f, + 0xc3829d6bace15f6b, + 0x76394bedcaf36ed7, + 0x38692dc21bf79d45, + 0xc721baf437f89cb1, + 0x1ad3f68546ecba2f, + 0xb97ac24654efd98b, + 0xc18bd3fa94d2e8f7, + 0x49d76efdc3f61975, + 0x75ef81adc2f937d1, + 0x14f78a5dcedb364f, + 0x9b8af4621fde54ab, + 0x87a23c665de18429, + 0x873fc9276ce4a295, + 0xf5bae91769d7a2f1, + 0x5e834c2876c8ae5f, + 0x39bf845874d9aecb, + 0xd29bf54ba4bfed39, + 0x179258c1f4e31da5, + 0xea78f31325e74c13, + 0xc1b98e3541d83a7f, + 0xc1d867943fca48eb, + 0x72de3ba54dce6859, + 0xa5d2c6198bd197c5, + 0x5fe9b67dcad5b743, + 0x32e469aed7c6b49f, + 0xc9475bd1f6b9c41d, + 0x5ecf3a2215bce279, + 0xa564e7f434adf1e5, + 0xdc43e58a97d54163, + 0xa359e6b871b53eaf, + 0x84e2bcf87fa85e2d, + 0x4dca12587eab5d89, + 0xd9187aedca9d7bf5, + 0x831b6cd1f9c1ab73, + 0xb93257821793a8cf, + 0xef419a5327a6c84d, + 0x87fa6de434a8e6b9, + 0x5b4e6ca984acf627, + 0xe62db31ba4bf1693, + 0xe258974cb1a234ef, + 0xfead54bdcfa7536d, + 0x4dca2151fea862d9, + 0x4156f3932eac9147, + 0xfdba83932b7d8fa3, + 0xed8c21b76a93be21, + 0xe7ca86f65683bc7d, + 0x37642ae98475dbe9, + 0x6d85b14dc389fb57, + 0x6214bc7fe48d1ac3, + 0xa358926fe29f3a41, + 0xb182fd9431a2479d, + 0xac815f443f95671b, + 0x2f678c443e6a9587, + 0x317b9ae76c7b95e3, + 0x5fa816ba9a8eb461, + 0x439b26fba871c2bd, + 0xc1eb295ed785e13b, + 0x6f2ca43ed365ef97, + 0x45916be325791ef3, + 0x2af46386548c3e71, + 0xa94268f6516f3bcd, + 0xb1476ea98f726c4b, + 0x3d7154ca9e546ab7, + 0xbfd9e25dcd689a25, + 0x63bfc2afea5cb891, + 0x2df41c3fe74ca6fd, + 0xafbd68332971e56b, + 0xc7694df32863f4d7, + 0x64d8f71ba7891645, + 0xba6d5f8a957a34b1, + 0x637e5dfba17c532f, + 0x2bf9d43bae4f518b, + 0x93d7415cbc426fe7, + 0x3d92b8a1fc349e65, + 0x6f54d9b32b479dc1, + 0xd38a46b32849ab3f, + 0xa513f2d5463eda9b, + 0x9e4732a98752fa19, + 0xade6317dc7641a85, + 0x1587ab9dc45738e1, + 0xbe681c4ed14a375f, + 0xb4cda5ffef2d45cb, + 0x8adfe9421e2f7539, + 0xa2598bc76e4293a5, + 0xe4f9c5d98d57b413, + 0xfcda17476a38b17f, + 0x842e51c87628afdb, + 0x9bd68e1ba62cde49, + 0x14856f3ed7421eb5, + 0xd69234a1f7564d23, + 0xd75863e214263b8f, + 0xd3874a66512849fb, + 0xf38d76b54f1d5a69, + 0xde1fab376c1f78d5, + 0x93b8c17bad12b853, + 0xbf9d58edc914b5af, + 0xa81947dfe918c52d, + 0x9c87da61f61be389, + 0xb1e27ca4371ce2f5, + 0x95617fe989514273, + 0xc1da3949862541cf, + 0xef5a637a92175f3d, + 0x5d231b476df75ea9, + 0x34db5f6a9cfb8d17, + 0xa15e27fcbafe9c83, + 0xaf13b48dc7e1a9df, + 0xd6237ea218f3c95d, + 0x543681d326f5e7c9, + 0x35219ba545eaf837, + 0xc49e6bf985fd17a3, + 0x7e2c314ba5ef4721, + 0x983254ccb1f2547d, + 0x7c39f4dcbfd563e9, + 0x6c8b4531fdea9257, + 0xc3586de32deb91c3, + 0x37816fb549cdaf31, + 0x9e6518b547c1be8d, + 0x7d9cf2e656b3dcf9, + 0x7618dc4a94d5fc67, + 0x31795beba5e91bd3, + 0x59e76fbdc4ed3b51, + 0x397b125fe1cf38ad, + 0xa6c9ef7541e3682b, + 0x8b9fd5632fd48697, + 0x176589a54dc896f3, + 0x89bd35476adcb571, + 0xf3adb797679ea3cd, + 0x7e5c61bba8c1e24b, + 0x517af48ed6c4f1b7, + 0x5e8467d1f7d93125, + 0xbdac837325ca3f81, + 0x2adf35b5429a3ced, + 0x92b17f8761af4d5b, + 0xabfec3765fa26bc7, + 0x4295bef98ec69b35, + 0xb61af3598dc7b9a1, + 0xe895a1bed79ab81f, + 0xb2e95841f59ed67b, + 0x498c5ab328a1f5e7, + 0x14fc5e2439c41765, + 0xe921ca8876b835c1, + 0x9b641e3982ba543f, + 0xd35e97b981ad529b, + 0xe796dcacbeaf7219, + 0x5f64b39dcda29f75, + 0x4ca9d681fb859ed1, + 0x3c69a5821b87ac4f, + 0x63abec532768dcab, + 0x7318cd65467deb29, + 0x2a453fc987a21b95, + 0x94257e6cb6a539f1, + 0x5e328d9dc2a7386f, + 0x6547cd3fe18946db, + 0x7f35ba1fef8d7649, + 0xd73e6a821e7f84b5, + 0x2fd431b76e94b523, + 0x12b6e9854c75b28f, + 0x92a376b65967c1fb, + 0xe6321c79876adf59, + 0xad86b25a946bfec5, + 0x46fa152ed7912e43, + 0xd86c1bafe2743c9f, + 0x5187f4d323875b1d, + 0x9c75b1d4316a5b79, + 0xecb86a443f4c79e5, + 0x258b39a87d5fa963, + 0x674efcb98c52a6bf, + 0xc7e941dcba75c63d, + 0x65ef81aed857e4a9, + 0x4812fb6fe86bf417, + 0xbd1e3893297e1483, + 0x6bd13ea6567142df, + 0x63a5be4a9384615d, + 0xbe537f1981465fb9, + 0xc4ed356a9f4a8e27, + 0x63c2f79bae4c8d93, + 0x2daf49ecb93d8aef, + 0x14c5a681f942ca6d, + 0x69a35fd21a34e8d9, + 0xd1fc68a32a38f947, + 0x59c2a317675c18b3, + 0xbdf64e7ba76e4831, + 0x7d3c4e2cb361458d, + 0xe9873d2dc15364f9, + 0x19fab86edf289367, + 0x319a4e21fe4a92d3, + 0x57b981c43e4db251, + 0xfcbd96e4382eaf9d, + 0xfe39a5276943de1b, + 0xf932de476924fd87, + 0x4e2d891ba7481ce3, + 0x25a1f86ed74b3c61, + 0x26b8e7fdc42e39bd, + 0x697823e1f241693b, + 0x1c6e5b95412368a7, + 0x7edbc9354f27a815, + 0xebad16c65e2ab681, + 0xf39e1d57691ba4ed, + 0x56a139f9891fd35b, + 0x1d289eacb913f2c7, + 0xbcfa653fea481235, + 0xec217581f73942a1, + 0xfca9574325193efd, + 0x27dbe686531d4e6b, + 0xb4edf53983216cd7, + 0x8af9cd287ef29c45, + 0x3c4abe587df59ab1, + 0x21d6c7398ae7b92f, + 0x2871a95dc6fad78b, + 0xd485f39cb5ecd6f7, + 0xb85247d43af21875, + 0xa86b5c9548f536d1, + 0x681dc9b876e8354f, + 0xd6c82f1872f953ab, + 0xd9e86b7ba1fd7329, + 0x8e91cb4baedf8195, + 0x7158cefbabc39fe1, + 0xf2b3478fe9c4ad5f, + 0x374295d218e6adcb, + 0xbcd5f64327daec39, + 0xde97a25436cdfba5, + 0xe8dcbf5a98e24b13, + 0x9eb4c1fba5d4397f, + 0x8ebd1c6ba2d647eb, + 0x5916a2fed1eb6759, + 0x98cab2dfefbd86c5, + 0x2bfad8421ecfa643, + 0x13f76ac54dc2b39f, + 0x1dca34e65ab6c31d, + 0x128c64e65ac8e179, + 0x61c4852876a9efd5, + 0x5e41836ba7bd1f53, + 0x8347219dc5b13daf, + 0xae712431f3b45c2d, + 0x9f74ed5212d65c89, + 0x26fd4b7431c97af5, + 0x7cf9a6154fbd9a73, + 0xc3a12ef54b8e97cf, + 0x5d2c9e798ba2c74d, + 0x6529143dc8a4e5b9, + 0x52461e9ed8b9f527, + 0x743a8b51f7bc1593, + 0x5e42d632169c23ef, + 0x5d89be7547b1526d, + 0xcde5396873b461d9, + 0xab13864a91b68f37, + 0x823a7ce76f798ea3, + 0xac65431a9e8cad21, + 0xf91de3adc96fab7d, + 0xb79a6841f872dae9, + 0x43759cd21b94fa57, + 0x8f35da2547a819c3, + 0x9fab825767ac3941, + 0x9a8e2368748e369d, + 0xd3f4ba1dc4a2761b, + 0x731feaced1b39487, + 0x15fa43bdcf8794e3, + 0xd617b5a1fe8ab361, + 0x871ae4532e6ca1bd, + 0x5c4721d4396ecf2b, + 0x189fac554a62fe97, + 0x3eb5c18879861df3, + 0xe425739cb6893d71, + 0x28d15a6cb4693acd, + 0xa746193ed27e5a4b, + 0x97ed6581f28169b7, + 0xde2867443184a925, + 0x9c8e2bf43f56b791, + 0xf5891c243c48a5fd, + 0xe9dbaf587a5cd46b, + 0x5432c969895fe3d7, + 0xcb87e39edb961345, + 0x6f4cab1fe98743b1, + 0xd4c75fbfe679512f, + 0xd92378a2135a4f7b, + 0xac8f2464324c5de7, + 0x6be7352982719d65, + 0x3461ecf87f549bc1, + 0x2e67bda98d46ba3f, + 0x12e7489bac37d89b, + 0x9bcea64eda4ce819, + 0x21f8ec6ed93ef785, + 0x6ab951c32a6437e1, + 0x175a8ef32947365f, + 0xc2d84518763854cb, + 0xb192378ba25c7439, + 0x3fd5841cb14e82a5, + 0x5a86e2bdcf64b213, + 0x5d7c8e2cbc23ae6f, + 0x2db65791f925aedb, + 0xbfe2c7621b28ed49, + 0xc85e6fd4382afcb5, + 0x1f29dec8795f1c23, + 0x1adc547a97423a8f, + 0x5e9f4c8ba62548fb, + 0x56749e1ed32a5869, + 0x9c21548fe12b87d5, + 0xb2834efedf1ea753, + 0xcdf1e6543e21b4af, + 0xb3578fd76e15c42d, + 0xf279d1465c16e289, + 0x53c19de87a29e1f5, + 0x2e615cdcba4d2173, + 0x2a18cd3a961d2ebf, + 0xf3e256ddc7125e3d, + 0xd174ba31f3145da9, + 0x5afbde7434298c17, + 0xd8ae97c6521c9b83, + 0x146d9e543ceb98df, + 0xbef531854aefb85d, + 0x89dfc2187af2e6c9, + 0xe163cf8cbae5f637, + 0xca5fe31ed8f916a3, + 0xb6c58f7fe8fc4621, + 0xf9e4a6c216fe437d, + 0x2b8c1ea545f162e9, + 0x23fdec9983f49157, + 0xc39bf5d871e68fb3, + 0x329fab187fd9ae31, + 0x9e7f1bd769ebac8d, + 0xc2d31f9987aecbf9, + 0x6da14f2fe9d2fb67, + 0xfc8eda3329e61ad3, + 0xa3e9c58548e93a51, + 0xd75e9a2545eb37ad, + 0x2fb49e1984de572b, + 0x3cef274cb3e18597, + 0xd9e37c1cb1d495f3, + 0x261f953dcfd8b471, + 0x75a9b861feb8a2cd, + 0x864e3c732eacd14b, + 0x5b8c9e43289edfa7, + 0xfc52dbe87ac42f15, + 0x28fd5c4879c63e81, + 0xad96f5b985a73bed, + 0xeca2574a93da4c5b, + 0xbc87fa1ed2be5ac7, + 0x2ab3dc71f2d19a35, + 0x74186c2432d4b8a1, + 0x6defb4843ea6b71f, + 0x9edb14643ea9d57b, + 0x61482c765a9bd4e7, + 0x75c13de989aef365, + 0x1586baeed9b534c1, + 0x28ba4c9ed8b7523f, + 0xd27c4831f4c8519b, + 0xe4f3acd2139a5ef7, + 0xca7b521432ad8e75, + 0x82dc43b763a29cd1, + 0xb17dcf376e83ab4f, + 0xb3def8276e75d9ab, + 0xfe5c8d9cbc78ea29, + 0x61829faeda7cf895, + 0x52f86beed79e28f1, + 0x47abcd2219a2376f, + 0x1879e5b3279645db, + 0x2a4d9e7763ba7549, + 0x1e6b32d8729c83b5, + 0xcfd98eacb19ea423, + 0xd942185bae72b18f, + 0x32784bea9c63afeb, + 0x3d526b81fb76de59, + 0x58abfd221a68fdc5, + 0x2379aef65a8c1d43, + 0x5796f1d5476e2b9f, + 0x6e3cfbaa97835a1d, + 0x1fde938dc3845a79, + 0xf3be17ddc26978e5, + 0x3c1a87bfe17ca863, + 0x879e524dce4d95bf, + 0xdb3178432f71c53d, + 0x36bf48132d64e3a9, + 0xc72db1a65c68f317, + 0xdb8cf47a9c7b1283, + 0xa78e235a986b31df, + 0xf74d386ba76e3f4d, + 0xe8b6a34ed4625eb9, + 0x1e46c721f3658d27, + 0x63a4feb212578c93, + 0x81b2adf4314a89ef, + 0x68951dc54f3eb96d, + 0xa1be3dc76c41e7d9, + 0x1236ce9bac53f847, + 0x16ec783edc5817b3, + 0xf1c572afea6b4731, + 0x48b61351f75c348d, + 0xf83be972174e53f9, + 0xe261879548539267, + 0xcd12b739845691d3, + 0x7cb8ef3a9258af41, + 0x57be98276f28ae9d, + 0x3c4fe7298a3ecd1b, + 0xbe574c1edb31fc87, + 0x46b9ed81fa451be3, + 0xc63ef1932c483b61, + 0x187cf6a5472938bd, + 0xfd715b27672d583b, + 0xefbd85aa942f56a7, + 0x5f4832bdc643a715, + 0xc7564b9ed236b581, + 0x9782f5ccbf17a3ed, + 0x56413971fe1ad25b, + 0xdbca61543b2de1c7, + 0x746cafd98d642135, + 0x9d6ce5f87b253f91, + 0x1835db9878163cfd, + 0x574e926ba7194d6b, + 0x1efd728ba41c5bd7, + 0x64b8729ed31f8b45, + 0x69a4d1c1f423a9b1, + 0xc39b25f54315b82f, + 0x51a8d6732ef5d68b, + 0xe1dc84a43be9d5f7, + 0xca2b84f76aecf475, + 0x3ed5ba4989ef25d1, + 0x791ef24cb9e2534f, + 0x83b4cf9ed7f652ab, + 0xdabf142fe5fa7129, + 0xa9bcd86213eb7f85, + 0x6d983e2543fc8de1, + 0x9472bce762e1ac5f, + 0xbaf3ec265fe3dacb, + 0x6c8ed9587cd6eb39, + 0xae692d487bd8f9a5, + 0x825ab64dc9ed2a13, + 0xe472163ed6ce287f, + 0xc7524b8218d246eb, + 0x5ca4f87328e47659, + 0x9e5471b763e984c5, + 0x9fb572d982eca543, + 0xabde612871cda29f, + 0x384762aa9fb3c21d, + 0xf3bce46bacb3df69, + 0x7fb1a2ddc9a6fed5, + 0x71c5ae432bca1e53, + 0xed2a6f14379b2caf, + 0x1b7ef36657af4b2d, + 0xd69cb58876d25b89, + 0x46b531dba3c479f5, + 0xa75643ddc2d8a973, + 0x1b29583ed1ba96cf, + 0x5aeb438dcf9eb64d, + 0x1c365f432fa1e4b9, + 0x2f5c68443db5f427, + 0x1db583f76dc81493, + 0xade29b8768a932ef, + 0xca54f7da98ac416d, + 0xdc6f37bba58e4fc9, + 0x8e95316ed5b28e37, + 0x9276ba51f2b58da3, + 0xcd71256434b8ac21, + 0x9edfcb243189ba7d, + 0x976fac143f6dc8e9, + 0x5cad2b876da1f957, + 0xdf871eba9da518c3, + 0x249e1fcedcb93841, + 0x6cb23f7fe78a359d, + 0xd7234681f79d651b, + 0x29abdec215af6387, + 0x216e478656a492e3, + 0xf6d3e41984a7b261, + 0x6d7423e651769fad, + 0x4ed5fc387f69ce2b, + 0x1c93f2498b5ced97, + 0x978bf4aedb821cf3, + 0x5e398d21fb953c71, + 0x9feca3821a7639cd, + 0xbc86e193287a594b, + 0xb1c76a44346d58b7, + 0xd2b9ef6ba47f9825, + 0xaf762d9dc483b691, + 0x89ec71acb175a4fd, + 0x635924edcf58d36b, + 0x948abcd1fc5ae2d7, + 0x61d59e832c7df145, + 0x1b4729376d8342b1, + 0x1f4e7ad76a754e1f, + 0x354f7db989564e7b, + 0x4685b9fba6495ce7, + 0x4a98251cb34d8c65, + 0xb2173efed35f8ac1, + 0xb9c537dfe162b93f, + 0xc89a64e32154d79b, + 0xfb5c2d943f48e719, + 0xacf179b54d3bf685, + 0xecf31d998b5d26e1, + 0xc614dbebab71345f, + 0x2641cf9ed96453cb, + 0x5c378b2fea587239, + 0xd5486931f64b81a5, + 0xcb7fa6d3254b8ef1, + 0x569a2d85423e9d6f, + 0xb1ca37576142acdb, + 0x184a63587f25ec49, + 0xfcd796a98d27fab5, + 0xe6913c2bad5c1b23, + 0x3ba15e6dca3d298f, + 0x67541fcfe93147fb, + 0x5e4ca2621b235769, + 0x6adeb1c4392786d5, + 0x721349f9872ba653, + 0xb368a5e8742c93af, + 0x46dfc5ba914fb32d, + 0x893adc2cbf23e189, + 0x7265d1cbab14dfe5, + 0xa1fb794fec291f63, + 0xb9ae78543a192dbf, + 0xf9ce78a6591e4c3d, + 0xc7fab94768215ca9, + 0xbf2e384ba9248b17, + 0x18f2ab9dc5169a83, + 0x42f81a5cb31897df, + 0x5ba21d3fe21cb75d, + 0xb8cf954babfed5c9, + 0x3894a5732de1f537, + 0x9fc582d54df615a3, + 0x9e68f1587cf94521, + 0x79bd82e769fa427d, + 0x6cf95d7987fc51e9, + 0x84372bcba5de6f47, + 0xb2d1584dc5f28eb3, + 0xf7534cafe4f6ad31, + 0xefc5dba212f6ab8d, + 0x1aed25b431e8caf9, + 0x598d67143fcdea67, + 0xfd35bec87ce219d3, + 0xd7e458fbace63951, + 0x8df2a15cb9e736ad, + 0x54cb8f6ed8ea562b, + 0xe19b26c1f5ed6497, + 0x6472bf3216ce84f3, + 0x39b7fdc656e4b371, + 0x315d2ea763e5a1cd, + 0x7498e5c761d7cf3b, + 0xc3db19a65fb9dea7, + 0x5bd4a1c98bacfd15, + 0x7f1c536febc23d81, + 0x5e2138d1f8b43aed, + 0x2d46c53219d74a5b, + 0x8f6d19b326da59c7, + 0x8ef5396546cd8935, + 0xf39248c764cf97a1, + 0xc435261a94c3b61f, + 0x2ef9b56ba1c5d47b, + 0x31678d9cbfa8d3e7, + 0xa7c6439fedabf265, + 0x57c38f954dae23c1, + 0x159f73476cb2513f, + 0x9f36d7c659a34f8b, + 0x9c8aed6548a65df7, + 0x132576fa94ba8d75, + 0xd5e7164ba49c8bd1, + 0x57bd493dc28e9a4f, + 0xb63e58d1f192d8ab, + 0xb2af794431b5e829, + 0xd5ac86332ea8f795, + 0x8f1d94665d9b27f1, + 0x31d268a87b9d256f, + 0x4b261fe98a9154db, + 0x6a3b547edab57349, + 0x926c174fe6a782b5, + 0xed62c131f69ba123, + 0x47c32bf2136b9e7f, + 0x926f1eb4326f9deb, + 0x238574c76182ed59, + 0x89cf51e76e74fbc5, + 0x146d25fbae891c43, + 0xbcd5eaf98c6b2a9f, + 0xf385ea1dca7e491d, + 0xb2437611fba15879, + 0x6d892b321a9387e5, + 0x67b3cad32598a763, + 0x26814c76536894bf, + 0x9cad7f29827cb43d, + 0x4be2f959816fd2a9, + 0xc4dfe23cbe84f217, + 0x973fc12ede972183, + 0xb21e784eda572ecf, + 0xbd952e621b6a3e4d, + 0xf18e6a33285e4db9, + 0xa23be6f65a618c27, + 0x43527e9ba7648b93, + 0x84cfeb3ba34598ef, + 0x1da956bdc249b86d, + 0x69371d4fe14bc6d9, + 0xa6b1e3ddcd3fe647, + 0x6e3d45732f7416b3, + 0xe8c9f1a65e784631, + 0x21f94ce76c59438d, + 0x3e9b28a87a4b52f9, + 0xf5ca13dcba4e8167, + 0x235e68fcb7518fc3, + 0x6a29573ed765ae41, + 0xb5468e31f235ac9d, + 0x1d4c8e532348dc1b, + 0xd2c9be75413ceb87, + 0x1273ce865c2df9e3, + 0xa54721da9e543a61, + 0xb3d4172a9c2537bd, + 0xc4572efedc29573b, + 0xa71b2c4fe92c65a7, + 0x5e1bac81f83e9615, + 0xf71956d43952b481, + 0x186423e65634a2ed, + 0x256197398437d15b, + 0xb897fad76128dfb7, + 0xfd4ca5698d1bfe25, + 0x97eb2c1bac3f2e91, + 0x97fe341dca123bfd, + 0x4bd57961fa154c6b, + 0x4ef9a7132b185ad7, + 0x97d25f64391c8a45, + 0xdf37b916562e98b1, + 0x8a5b2dfa9631b72f, + 0xbd39481ba413d58b, + 0x26e7389cb216d4f7, + 0x6798fa3cbde9f375, + 0x68f123afecfb24d1, + 0x53697ab21bed324f, + 0x9fd723b54cf251ab, + 0xe249f6165ae46f19, + 0x5d376f9549f67e85, + 0x56a4ce9875f98ce1, + 0x64d5e2c983ec9b5f, + 0x12ab6e4982efa9cb, + 0x5b9a6e2ed1f2ea39, + 0xc16e35b321e4f8a5, + 0x9baef1365fea2913, + 0x2a7df3154cdb267f, + 0xc2735b9769cd35eb, + 0x49e16b8babe17459, + 0xa29674ccb9e483c5, + 0x56a748ced7e8a243, + 0x3879a54fe4d8a19f, + 0xaed7926213ca9efb, + 0x2eb86f5432bfce69, + 0x9b45238761b2fcd5, + 0xae1d43298fc71d53, + 0x4e8bfa276dc72baf, + 0x63d17a4989cb4a2d, + 0xba4f8c7ed7ce4a89, + 0x5b3af72fe9c178f5, + 0x859cfbe219d4a873, + 0x9ef5cb3324b695cf, + 0x2b7e915763c9b54d, + 0x9a78fd3762acd3b9, + 0xebf56c1a91bfe327, + 0x6782d3ecbfc51293, + 0xe6dac93cbca631ef, + 0x945dc16feba83f5d, + 0x7b63d2521b8a4ec9, + 0xa15be38329ae6d37, + 0x6bca178657b18ca3, + 0xaf74b6c987c5ab21, + 0xcfd4e72983a5b97d, + 0xd182397cb2a8c7e9, + 0x2ca54f8ed1ace857, + 0x7f41d36cbd8ef6c3, + 0xab6134532fb53741, + 0xebcd34f32ea6349d, + 0xfeb4c8165da9641b, + 0xc83e46965bac6287, + 0x1fe734dba79d81e3, + 0xbe85316dc792af51, + 0x4513abddc4739ead, + 0xd61e4291f386cd2b, + 0xeb36f2821268ec97, + 0x6de235a5417beaf3, + 0x18b47ad65e8f2b71, + 0xc4e73ad76e7238cd, + 0x6cde4f8bad96584b, + 0x54b3ae9edc8956b7, + 0x4afb3c1fea8c9725, + 0xedc2a141f67ea591, + 0x187dafc32671a3fd, + 0x68ba1c443584d26b, + 0xca783f965386e1d7, + 0xd6f72be98179ef35, + 0xd5b261e98e6c2fa1, + 0xdb72c8ea9b6e3d1f, + 0x364d1a8fec624d7b, + 0x41d5e281fa645be7, + 0x84f573b21c498b65, + 0xa6f7db14375b89c1, + 0x3ac6e575465da83f, + 0xc15eda498451d69b, + 0x564df83cb374e619, + 0xe73a9fddc167f485, + 0x275b49adcf6a25e1, + 0x1c742dffed6c235f, + 0xc2ab6d721d5f42cb, + 0x3142dfc65d647139, + 0xf973ad276b347f95, + 0x83a2fe5769478df1, + 0x96ed3129853a9c6f, + 0x5fae3499843e9adb, + 0x71ef3a2ed351eb49, + 0x17fc398fe143f9b5, + 0xda6b1f7654681a23, + 0x31bc78654e3a278f, + 0x1c7329865d2c36fb, + 0xc4193de98c2f4569, + 0x13b8fdcbab3284d5, + 0x9bfe563edb27a453, + 0xc81b9e6ed63792af, + 0xa1c45761f64ab12d, + 0x9ed675b2142dcf79, + 0x5b7f98176431fde5, + 0xe2d641ca92451e63, + 0xa8cdf3b87e162cbf, + 0xd23e5c998e194b3d, + 0xa37edc298c1d4ba9, + 0xa4e2f85edb2f6a17, + 0xd62a1e91fb12a983, + 0x4936d1b3281496df, + 0x52ba6f743718b65d, + 0x8f7ecd47651ad4c9, + 0x5f138d4a951de437, + 0xda76e23dc65214a3, + 0xa719e2fcbef65421, + 0x5213498cbcf6417d, + 0x57342b6dcae74fd9, + 0x9de258421afb6e47, + 0x9f163be328fe7db3, + 0xd9b7ae2768f2ac31, + 0xf3daeb7765f3ba8d, + 0x4de592a873e5c8f9, + 0x6f27819cb2fae967, + 0xf58931bba1ebf7d3, + 0x32d6b51dcedf2851, + 0xdba56e321fe235ad, + 0x91c42ef43de7652b, + 0xc795ab354cea6397, + 0x3784acd769db82f3, + 0xfa85321a98dea271, + 0x7ea2654985c19fbd, + 0x12385c6ba5d4ce3b, + 0xe1ca3941f2c5eda7, + 0xe59a43b323d9fc15, + 0xe96dc72653ed2c81, + 0xf389cad54caf29ed, + 0x2e1bdf587ed2495b, + 0x17e34f6a9bd458c7, + 0xfb18d3edcbda9835, + 0xc257bfafe7dc96a1, + 0x4c8bf73fe6bda51f, + 0x85c4de6326c1d37b, + 0x26ea189435b4d2e7, + 0xd1e846b873c8f165, + 0xa7cd35b984da32c1, + 0x28d5c4187d9b3e2f, + 0x2b349a887c9f3e8b, + 0xfb6e49cedba25cf7, + 0x3e78d1c1fab48c75, + 0x9fecd51329b78ad1, + 0xa94dc6b3268ba94f, + 0xa2be6714348ec7ab, + 0xdc1b572985b1e729, + 0x9c24b6fba2b3f695, + 0xae4581bdc3b826f1, + 0x67fb4eadce9a246f, + 0xcb326ed1fe8c43db, + 0xf43cb6a21daf6249, + 0x7c563d254da381b5, + 0xd7e394a65ba69f13, + 0xe289cf5545869d7f, + 0x961f2dc874689ceb, + 0xb13d472ba37edc59, + 0x63ae1cbed381fac5, + 0xde75ab41f2a61b43, + 0xba5798f431a6289f, + 0x48ce26143f7a481d, + 0xe9f584143e8d4679, + 0x6b2cfd554b8f76e5, + 0x2a4813ccbc92a563, + 0x8a613f2dc87593bf, + 0xa4b9d78fe678b23d, + 0x523bde91f46bd1a9, + 0xebf72ca2136bcef5, + 0x34f18c2765921f73, + 0xf37b54e761742dcf, + 0x37e564f98f673c4d, + 0xb39ce4887e584cb9, + 0x725bf84bac5d6b27, + 0x1cf847aedb5f7a93, + 0x784e9f3ed85297ef, + 0xe7c2d6b21954b76d, + 0xefba79532647c5d9, + 0xa1d5e929836be547, + 0xc4127a59826df4b3, + 0xf98a125dc6924531, + 0x46fcd32cbf65428d, + 0x8a6243fdcd4751f9, + 0xdb2179ffec3a6f57, + 0x7524d3621a4b7ec3, + 0x5e8ac7f43a5f9d41, + 0x9416bde65742ab9d, + 0xd523e4f98745da1b, + 0x86fc1e7cb436ea87, + 0x7fc152ecb24af8e3, + 0x15c8e32ed35e2961, + 0x32bdf48fef4136bd, + 0xeabc9d321f24563b, + 0xf578a1243e2864a7, + 0x8bd3e4287d3b9415, + 0xba9dc4387b4da381, + 0x1e6fa479873f91ed, + 0xbd42938ba732cf4b, + 0x4627d8adc524deb7, + 0x2a57fd1fe438fd25, + 0x75f281d4354b2d91, + 0x872d4e36513c2afd, + 0x9cea3d187f214a6b, + 0x1567fd498e1359d7, + 0x3ae91c2cbd178945, + 0x4f5128bedc2a97b1, + 0x5e2bc68ed81ca62f, + 0xf54cbadfe61fc48b, + 0x79c28ef54812d3f7, + 0xc61b5ef54816f275, + 0x2ac4f919864923d1, + 0xb17a426a952b314f, + 0x14c5ba776dec3f9b, + 0x5a9de3f98bdf5e19, + 0x6de493adcbf27d85, + 0x52871b3ed9f58be1, + 0xf9de537218e79a5f, + 0xb519d4a325f9a8cb, + 0x829d51a545fed839, + 0x7ade4b1984e1f7a5, + 0xc685374cb5f62813, + 0x29c137fcb1e8257f, + 0xd8315efbafd934eb, + 0xac27b5e1fced6359, + 0xb567cd821bdf72c5, + 0x345adeb76ce5a143, + 0x245b871437c49e8f, + 0xcaeb35d545c69dfb, + 0xc59b24d874eacd69, + 0xdac52e3983acebd5, + 0xfb39518ed6e21c53, + 0xf5ca8b2fe1d429af, + 0x5ce94fd431e7492d, + 0x56d9bfe32fdb4789, + 0xb76fc4543dbc67f5, + 0x649efb265bcf9673, + 0x24a8bde878b294cf, + 0x63c5124ba8c6b34d, + 0xf735d96fe5c7d2b9, + 0xa35e7b91f5cbe127, + 0x3f29bda214acef83, + 0x47c2b6d654a12edf, + 0x35efc94871b43e5d, + 0xa2b379f65fa64dc9, + 0x1b5a3f498eba6c37, + 0x427fedb98c9d7ba3, + 0xb7fca29ed8bf9a21, + 0x6295e371f6a2b87d, + 0x6b58c9a217a4c6e9, + 0x736c45b324b9e657, + 0xa34bdc77649af5c3, + 0x2ecfb46a95be2641, + 0xb7d345eba2b1439d, + 0x97b3462dcfa5631b, + 0x1376ef5edeb96187, + 0xbf6318cfeb897fd3, + 0x71f8eb332b8c9e51, + 0xc69f4e73276f8cad, + 0x67fd1b265783dc2b, + 0x7c8fe5d76584eb97, + 0x94be618ba487e9f3, + 0xc87ea2bed49c2a71, + 0x1e258d9cb18e27cd, + 0x6d53ba2fef91574b, + 0xb85f7c621f9365b7, + 0x168fbd443ea89625, + 0x4ab328f65d7ba491, + 0x9fe67316586b92fd, + 0xa5edf23a987fc16b, + 0xe4dc893ba562dfc7, + 0x218eb57dc486fe35, + 0x35e6ac11f4782ea1, + 0xda34c873247a3c1f, + 0xac173285416e3c7b, + 0x38d5ea954f615ae7, + 0x1da325ea9e738a65, + 0x342d189bad5698c1, + 0x52b1793dcb59a73f, + 0xda76bf4fe74dc59b, + 0x52b76adfe76fd519, + 0x7dc9e2821972f385, + 0x361bcf46568724e1, + 0xc1d5e9a98479325f, + 0x6a5d3b29826a41cb, + 0xa2f567c98e4d5f29, + 0x2c56819cbd417e95, + 0x92bac47edb548cf1, + 0x3d298b7fea359b6f, + 0x8fe4a6321837a9db, + 0x84f1dcb3273cda49, + 0xd8a293e5463fe8b5, + 0x68597cacb8751923, + 0x3f5e642cb345268f, + 0xad65b82dc14835fb, + 0x42615c9edf2c5469, + 0x7c93e121fc2e73d5, + 0xe53791c54e61a253, + 0x48a92f665c3491af, + 0x18294ea65936af1d, + 0xd8243be65628ce79, + 0xa94f5c29862adce5, + 0x3de62c5ba52efc63, + 0x71f859aed5432abf, + 0xc8496e21f1264a3d, + 0x45a1e264312748a9, + 0x296ed5854f2c6917, + 0x46b9e1765d1e9783, + 0x2968f1d87b2195df, + 0x73c1de4a9a13b45d, + 0x68efda9cb816d3c9, + 0x1a82f74ed81ae237, + 0x9fc1b6afe62cf1a3, + 0x94f71ac7685f4321, + 0xc2d139f875123f6d, + 0x2ae893c872154ed9, + 0x4a12f3965ef86d47, + 0xfc38b4d76df97cb3, + 0xc3df26a98afd9b31, + 0xaf4c912cb6efa98d, + 0x8bf7295ed6e2c7f9, + 0xac87bf6219f4e867, + 0xa1ebcd6325e8f6d3, + 0x1693fcd986fc2751, + 0x3f952cd873fe24ad, + 0x7895b42ba3f1642b, + 0xf7a1ed4cbfe46297, + 0x8da7913cbcd781f3, + 0x8b96f41febda9f61, + 0xa57e3b2217ca8ebd, + 0x5e4d7c3327cfad3b, + 0xe63d5bf546d2eca7, + 0x524df9e987d6fb15, + 0xde7f53cba5e92b81, + 0x5b8a376a93ca28ed, + 0x38eb4fadc1de385b, + 0x9a3c7bffefd156c7, + 0x6e58a4b21fd49735, + 0xe7cd8f543ed795a1, + 0x7e3214d65bc9a41f, + 0x7f8d1b6658adc27b, + 0x4dc3f51986afc1e7, + 0x348d12fba7b2ef45, + 0x7153296ed5c62fb1, + 0x265a79dfe4b83d2f, + 0xf65ca34212ca3d8b, + 0x987cf4a431ad4bf7, + 0xf2bc59d54fc18b75, + 0x37bce5876eb489d1, + 0x4f81d9a87cb6a84f, + 0x2e35fa7ed798c6ab, + 0x9174dcffe7acd629, + 0x4f3ea96ed6afe495, + 0x478569b438b425f1, + 0x7bf921d545b7236f, + 0x85da7c9763a842db, + 0xbadf2e4982bc6149, + 0x9eb318d87e8d6fa5, + 0x6593dc1cbda29e13, + 0x385f7acedb839c7f, + 0x962b7181f8759aeb, + 0x7b4c2ae21a78db59, + 0xd7a3f983267be9c5, + 0x7148cf66568ef943, + 0xf215ae3985a3279f, + 0xc829436cb3a6471d, + 0x21b6cf4ed1ba4579, + 0x2a53b91dcf8b74e5, + 0xc6ea74d1fd8e9463, + 0x62841ab43d7192bf, + 0xda589fc54c85b13d, + 0x8b9ad2543a65cf89, + 0x2958ab154768cdf5, + 0xa64523ba956bfd73, + 0x5f23d7aa946e1bcf, + 0x975d816fe5823b4d, + 0x42d7cba1f1754ab9, + 0xbda28e5431896a27, + 0xfd95ae432f5c7893, + 0x64c1be743b4c86ef, + 0x354a9e798c71b56d, + 0x75d29c698a63c4d9, + 0x746ab53dca68e347, + 0x382c71eed769f2b3, + 0xbe521381f78d2431, + 0x1ace47f3256f318d, + 0xc2d643e653624fe9, + 0x34f72dca91846e57, + 0xdc798f476f487dc3, + 0xdc45b3698e5b9c41, + 0xeda2fc887b3e8a9d, + 0x6a981f4fea52d91b, + 0x296758e1fa43e987, + 0x7f2db8921946f7e3, + 0x68ab13f5495b2861, + 0x658cda18764c25bd, + 0xe8f621aa926f453b, + 0xaf951d8dc15263a7, + 0x83f7a2edcf479315, + 0x26b41c8ede49a281, + 0x76915dbfea298fcd, + 0xa3cde672192dae4b, + 0xb29f83654931edb7, + 0x48a965c87934fc25, + 0x734f528ba8472c91, + 0xfc742edba53829fd, + 0x1a9528bdc42d396b, + 0xb873f64dc12f48d7, + 0x3d64752fef129845, + 0x651fc7e43f2596b1, + 0x9ca765b54d18a52f, + 0xfb67cda65d1ac38b, + 0x82cd7417691dc2f7, + 0x1f23a5dcba32f175, + 0x9532fd4dc94632d1, + 0xa82f4e5dc6172e3f, + 0x8a5b1791f4183e9b, + 0x148c9e74342c5d19, + 0xf16ae975421f6c85, + 0x2f179a865df28ae1, + 0x3cd5be176ce3a95f, + 0xf5d3a14769f5a7cb, + 0x6e4928fcb8fad739, + 0xe178c5fcb7fce6a5, + 0x631f75ddc7def613, + 0x4daf865218e3247f, + 0xf5713ce325f643eb, + 0xd2c9543873fa6259, + 0x9c4613a982fb71c5, + 0x96d5ac887ecd8f23, + 0xa6be18387bc19d8f, + 0x98cb374ba8d39cfb, + 0x8c596131f8e5dc69, + 0x5348fb9217c8ead5, + 0x9eb54f7327dcfa53, + 0x18d279e545ce18af, + 0x71d54caa96e3482d, + 0x5634c1ecb2e54689, + 0x5f94362cb1d976f5, + 0x67f31edcbfdc9573, + 0xcdb24f7febad83cf, + 0xfd7285943ec1b24d, + 0x2b5719a43ac4d1b9, + 0x1be987f549b6df17, + 0x437f8ec656b9fe83, + 0x92864cf8759a1cdf, + 0xe3c1658a94af2c5d, + 0x9caf8d4fe3d24bc9, + 0x128ab5d1f1d56b37, + 0xa41c769321d879a3, + 0x62d79cf54fbca921, + 0x984f21b43c9ea67d, + 0x8e3174a76ba1c5e9, + 0x7af61d3a9ab3e457, + 0xf1dc38acb8a7f4c3, + 0xf9b21d5fe8cb2541, + 0x53b9d2c1f5ac329d, + 0x4cd87bf436af521b, + 0x5e67df8543b25f67, + 0x89cf537761a57ed3, + 0x14b389a76fa89d51, + 0xb6f71d465e698bad, + 0xf1973a59897eca2b, + 0x23eb7f8edb81ea97, + 0xc34a28bed794e8f3, + 0x6df942743ab82971, + 0xf84e9ad4358926cd, + 0x6fc85b38759d364b, + 0x7b13a6e9829f54b7, + 0xb371fdedc1b39425, + 0xdb64a79dcf86a391, + 0x5496a78cbc6791fd, + 0xbd62c45fec69af5b, + 0xdfa98352195dbec7, + 0xec1d23f54a81fd35, + 0xbfde712769852da1, + 0xe73251fa96873b1f, + 0xdfe4763dc4693a7b, + 0x94c5326cb26c49e7, + 0x8625f3ced18f7965, + 0x4ab35c6fef6397c1, + 0x47ab25e21e75a63f, + 0xfcbea8132e57c49b, + 0x81b9af665c6bd419, + 0x5dc6ab487a6de285, + 0x279153ccba8423e1, + 0xd572f93dc986315f, + 0xb541e73ed4563fab, + 0x71e2c4b1f36a5e29, + 0x326d85e2124c6d95, + 0x3b61cd95425e7bf1, + 0xa4b63e165e429a6f, + 0x39b8a2e76e34a8db, + 0x7e65382bac37d849, + 0x984fa36dc93ae7b5, + 0xdfa6958dc95df723, + 0xca3b4d9fe961258f, + 0x57e426b2186534fb, + 0xa9b7e8f327485369, + 0x9d125ce9834a72d5, + 0x715b46fba26d9153, + 0xfd51e4b76c2d7e9f, + 0x1d7a5e2a9c43ae1d, + 0x4d56f98feb24cd79, + 0xb183d2e1f927dbe5, + 0xe8ac9622192afb63, + 0xd5bf9c15473d19bf, + 0x6c294d587851493d, + 0x57962a4cb62347a9, + 0x3f41e7bdc4396817, + 0x8291fc6ed12b9683, + 0x4e8bf56bae1b84df, + 0xc5f7ba6fec1fa35d, + 0xfe63da954e13d2c9, + 0x36af4eb65c26e137, + 0x34ab68965a17ef93, + 0xfe5479c767291def, + 0x6ea48c3a971c2e6d, + 0xf847231cb6214cd9, + 0x53a89d6fe5136c47, + 0x764ac391f2167ab3, + 0x3daefc16542b9a31, + 0xe139f4c32efba78d, + 0x6dc9be543aedb6f9, + 0x2ad7e6498bf1e567, + 0xd3fc4be989e4f5d3, + 0x3b7deafdcaf92651, + 0x13b2e47dc6f923ad, + 0x1f6ca92fe6fd532b, + 0x1ef5c3b324ef5197, + 0x21693b8654d27fe3, + 0xfe13d65872f59e61, + 0x28dac7154fe68cbd, + 0x1e8c73d76de9ac3b, + 0xad2befc768cedba7, + 0x68aed3bdc9d2fa15, + 0xe35198b1f9e52a81, + 0x957ca2b218c627ed, + 0xdc1ea59326ea375b, + 0x281ba4d763ed45c7, + 0xe5d127ba92df8635, + 0x5e386f2cb2e394a1, + 0x42b3df8a9ec6a31f, + 0x7d4f61ebaed8c17b, + 0x6bd47cafe8a9bfd7, + 0xa65482f219acde45, + 0xacde7b9659c32eb1, + 0xd7a83e9768b53c2f, + 0x82d4596875d63c8b, + 0x4e316a9983c94af7, + 0xe4c36dfcb2cd6a75, + 0x58af794dc2bf78d1, + 0xb1cf695edeb2a74f, + 0xb7c86a421f94c5ab, + 0x5276e9f43eb8d529, + 0x9a326d554cabe395, + 0xb4caf8d7689ce3f1, + 0xe1c897fba9b1326f, + 0xe92b35ddc7a541db, + 0xe7cb264ed4b75f39, + 0x4b539a71f2b96ea5, + 0x7adfb6e324ac8d13, + 0x875cb9f4319e8b7f, + 0xa5b2df354f72a9eb, + 0xd5f928e76e84da59, + 0xdea142776b97e8c5, + 0xbfa1784dca9bf843, + 0x4521f9ddc78d169f, + 0xe4635ad1f8a2461d, + 0x5f68c27218b35479, + 0x94be31f324a873e5, + 0xb4e56d1874ab9263, + 0xfe3197d7627c81bf, + 0x45f1eb987c6e9f2d, + 0xcb852f3bad62ce89, + 0x67e19cacba74dcf5, + 0x2af9c58fea68fc73, + 0x93af854328691acf, + 0xd41fb864387e2a4d, + 0xd942c876567148b9, + 0x17f4ed3cb5a46927, + 0x16fe823dc2a68793, + 0x419237fcb16985ef, + 0x14326afcbf5ca46d, + 0x5db1ac2fec5fb3d9, + 0x87ad36b21d83e247, + 0xcd352e754c76f1b3, + 0x98cb46e87c8a4231, + 0x4fceb817685a2f7d, + 0xca4bf3d9865c3de9, + 0xeabf29ddc4816d57, + 0xa7265cffe2647bc3, + 0x137d6ea1f2679b41, + 0xd537ce832147a89d, + 0x2c1795843f4dc81b, + 0x758ba9d54c3fd687, + 0xd7ce43598b52f6e3, + 0x1a4de7fcbc582761, + 0xeda25f6dc95824bd, + 0x49a1df3fe86c543b, + 0x31a75821f64e52a7, + 0x6e87192548739215, + 0x8a4b53e763549f71, + 0xf2cd1a5761358ecd, + 0x83f972476f28ad4b, + 0xf754e2876e2adcb7, + 0x75a3c21a9a3feb25, + 0x5d236b7fec542b91, + 0xabf4829fe93528fd, + 0x3578c9621a29386b, + 0x2b7af8d4382b46d7, + 0x82d143aa962e8745, + 0xf95463bba64295b1, + 0x38d7fa1cb135a42f, + 0x6df287ebaf16c28b, + 0x938a2d6cbd29c1f7, + 0x29f8671fea1bdf65, + 0x8c196db4392dfec1, + 0x1b5d74c76a142d3f, + 0x257b914768153d9b, + 0x29578beba7285c19, + 0x892671eba41c6b85, + 0x56d1782cb42d79e1, + 0x9f1835bed321a85f, + 0x176c952edef2a6cb, + 0x743b56c21ef5d639, + 0x1cd493e32cf8e4a5, + 0x9e7f32876aebf513, + 0x7dab521769ed137f, + 0x7ef8cb1a98f142eb, + 0x743be29dc8f46159, + 0xda79f43dc3e76fb5, + 0x7685b34ed4fa8e23, + 0x7feb243212eb7c8f, + 0x945cde6431de8afb, + 0x5f36a7854fe2db69, + 0x91532cb76bc4e9d5, + 0xfd91a4687bd8f953, + 0xcf18b5aa98db17af, + 0x862da9ecb8ce372d, + 0x87d12c31f7e14589, + 0x23a98b6218d374f5, + 0xc5f1e78325e89473, + 0x92a8b7f653d982cf, + 0x9ba48d2872eca14d, + 0xae9261c65d8ebfa9, + 0x413f5eba9cb3de17, + 0x243a1b8dcab5fd83, + 0x51f736bfe8a71bdf, + 0x78fb359218ca2b5d, + 0xd9fb317326be3ac9, + 0x3f14ae9658d16a37, + 0xc5a2714a95d478a3, + 0xe961235cb4d7a821, + 0xf8e2c94cb1c9a57d, + 0xe6419b5baf8cb4e9, + 0xa8953dcfecafd357, + 0xb64e7fa21da4f2c3, + 0xafb7de376dc82341, + 0xaf9c3e465ab8319d, + 0xdbc61786568a3ef9, + 0xb27df5ca95ad4e67, + 0xa162c45cb5a17cd3, + 0x32647c8fe3b49c51, + 0xb9cde4a1f1b589ad, + 0xe26b4d1431a8c92b, + 0x8ce6f9332f6cd897, + 0x8b5e19d54b8ed7f3, + 0xfbd4ae7a9db42871, + 0x41572ea98a9625cd, + 0x12afbe4ed8a9354b, + 0xf69d42bfe69c53b7, + 0x85eb7ac1f6ae8325, + 0x78d19b2546b3a291, + 0x27e8fb6542738fed, + 0xb31edf654186ae5b, + 0x17bf8e354f58bdc7, + 0x135ba7d98d7bec35, + 0x19fad239896efba1, + 0x4fb9e2aedb843a1f, + 0x7ed5c261fa85397b, + 0x256f87c21a6948e7, + 0x5769f3a3249c7865, + 0xe69f84a6547e86c1, + 0xec7813da9481a53f, + 0xd249b73ba174c39b, + 0x8f26e79cbf67d319, + 0x21935aedcd6ae185, + 0xe93fa72dc95aefd1, + 0x59c3e8432a6d1e4f, + 0x6aebd1c549623eab, + 0x289d15654a765d29, + 0x25cd389ba7486c95, + 0x4e378fda945b7af1, + 0x37ef259cb24d896f, + 0xbfa1c5dfe251a7db, + 0x8c792fdfef53d749, + 0x9ab72c821f37e6b5, + 0xbfa23e954d5af623, + 0x487bdfa76b5c148f, + 0x53c619b8795e23fb, + 0x85ab497dcb735269, + 0xd975e26dc94671d5, + 0x2be5197ed6598f43, + 0xa625fc7fe23a7d9f, + 0xc3869d13234e9c1d, + 0x76f4b8165241dc79, + 0xde295fb76f23dae5, + 0xad6c2e798d27fa63, + 0xfb3694a87c3918bf, + 0xac1762fcba4c283d, + 0xa824567ed82f36a9, + 0xda584be1fa438617, + 0xa79f34521a269583, + 0xc591ad75452783df, + 0xdae56288743ba25d, + 0x8ae13f68723eb1c9, + 0xe5d7186a9e31df27, + 0xb57c849bac14fe93, + 0xf1e2a67cba261cef, + 0xb2da8391fa192c6d, + 0x91bc8a63281c3bd9, + 0x14a57cb4391f5b47, + 0x3ec978f7681279b3, + 0x814cde7cb726a931, + 0x82f73a4cb317a68d, + 0x6bf92d5dc21ab5f9, + 0x4f937bebaefcd467, + 0xcf46d17cbacfe4d3, + 0xb524ef843df62451, + 0xe12958354bf632ad, + 0x834e71f76af9512b, + 0xfa6de38656eb4f87, + 0xf256da9985fc6de3, + 0xf13d4aecb5f29d61, + 0x3298715dc2f38abd, + 0x1c67a8bfe1f6ca3b, + 0x68dec7f321f8d9a7, + 0x59126d443fdce915, + 0xe9b7f3654bcef781, + 0x4d5193a87ac326ed, + 0x4e67cdba9ae7365b, + 0x48d6c31cb8e954c7, + 0x3684e2bed7ec8435, + 0x7b386d51f5de83a1, + 0x63f8cdb546d3a21f, + 0xa62f3de542d3af6b, + 0x9a1b623541c5bed7, + 0x7b4d35e76fb9ed45, + 0x12e37db76d9afcb1, + 0xc176d2a989ae1b2f, + 0xc91a3b6fe9d23a8b, + 0xab3dc87fe8c549f7, + 0xc92a356218da6975, + 0xa2d7fb4435cb87d1, + 0x2a473ec653bd964f, + 0x8bd6cf5873d1c4ab, + 0xf27c6b8ba1c5d429, + 0xbe38674bafb7e295, + 0x2e7c964cbca9e2f1, + 0x253fb1cfebac216f, + 0x246c9b52198e2fcb, + 0x561d73f54ab25e39, + 0x5b8c9d2438b46da5, + 0x5df1983876b98c13, + 0xb2f15397639b8a7f, + 0x4c7e83dba27d98eb, + 0x1f59ba8fe2b1d859, + 0x3b89a24edf93e7c5, + 0xb5847ad21ea8f743, + 0xb81fc9a43d8a159f, + 0x9a5718376b9c351d, + 0x8bd534f76baf4379, + 0x89f63aecb9a372e5, + 0xae45f29ed8b79163, + 0xba149d5dc3867eaf, + 0xae8472c1f37a9e2d, + 0xab5c6342126ebd89, + 0xeb9258a54281dbf5, + 0x4c6ed1365e84fb73, + 0xfb12d3765d7619cf, + 0xef2bda398c7a294d, + 0x19d4efadca6d37b9, + 0x6a28c13eda9f5827, + 0x7d5b4981f7a28693, + 0xcda67592167584ef, + 0xa6b5e7832478a36d, + 0x7b1423f6536ab2d9, + 0xdf28e35a928ed147, + 0xae6d5cb98d61efa3, + 0xc317658cbd863f21, + 0x87e25bddcb562e7d, + 0xe3a84671fa583ce9, + 0x265ba9f21a6d4c57, + 0x35176483285f6ac3, + 0x73c29f4768739a41, + 0x2cdf57e98354a79d, + 0xd1bc5e4ba358c71b, + 0x428516adc14bd587, + 0x57429e8baf4cd5e3, + 0x23754ae1fe832561, + 0xa7892eb21e6523bd, + 0x618bd5a54d68523b, + 0xa32f5be76c4b51a7, + 0x4d85ea18784b6ef3, + 0xfd69c25ba64f8e71, + 0x34b8e26ba5428bcd, + 0x45d7968fe235ac4b, + 0x5842d671f136dab7, + 0x96fe54a4314bea25, + 0x68ca5fb54e3df891, + 0xd2b39f576c4127fd, + 0xd5b8ac3a9d24376b, + 0xe38d5f2bab2845d7, + 0x37e25b1eda2b8645, + 0xd39c158fe73d84b1, + 0xa3b8275ed64e932f, + 0xce3d9ba32643c18b, + 0xc3b7a6965324bfe7, + 0xeb351f987128de65, + 0x32f5be976e29fdc1, + 0xf3247db98b2d1c3f, + 0xfb6951ebad213c9b, + 0x63ac12bfec245b19, + 0x2496c171fb176a85, + 0x5f1c67e4392a78e1, + 0xb42c58f4361c975f, + 0xfe745cd7641f95cb, + 0x914726cba612d539, + 0xd756ce3cb216e3a5, + 0x3be42d6bade8f413, + 0xe523784cbcea127f, + 0x9ba1f25ed9fc31eb, + 0x2bd365421ade3f49, + 0xcaef857439f26eb5, + 0xcde76a4659f68d23, + 0x2f637da654e67b8f, + 0x1ef79a8763ea89fb, + 0x457cdb6982feca69, + 0x9fe7ac4cb2f1e8d5, + 0x18d2bfedced4f853, + 0xdfea89c32ed716af, + 0x3df981b54cea362d, + 0x9cabf6765bed3489, + 0xd2c3584879ce63f5, + 0x71f64a9cbae49273, + 0x5bd6381ba6d581cf, + 0x3c41f58cb4c79f3d, + 0xe42c51b1f2d8bea9, + 0xad348eb323becd17, + 0x14879cb652d1fc83, + 0xeba871d65eb41adf, + 0xf3e928c76ec72a5d, + 0x9d2c7bf76bda38c9, + 0xc3612f5cbacd5937, + 0xac62817ed8cf67a3, + 0x49b36281f8d4a721, + 0x89475d6216c5a47d, + 0x43e17ab324c7b3e9, + 0x1fbe79c763cbd257, + 0x8e1c9bd872ade1c3, + 0x1c7e9d3bafc53241, + 0xf52eab1a9ca42f8d, + 0x2396a8edcba63df9, + 0x7584b1e1f9ba4d67, + 0xfb674822189c6bd3, + 0xa79c86b437af8b51, + 0x31c6d58545b298ad, + 0xeb2dc53874a5c82b, + 0x4217fe8ba2b8d697, + 0xed7345acb19ad6f3, + 0x7e9156ccbe9df571, + 0x17edc431fe9124cd, + 0x9bc8e6a21ea6534b, + 0x9681cfe43da852b7, + 0xfd1853e76cab8125, + 0xa7e43296569c7f81, + 0xd37b5f99846f7ced, + 0x24368b5dc482ad5b, + 0x43d5681fe284dbc7, + 0x6c8ea3d1f198eb35, + 0xf7ad84c4327bf9a1, + 0x235196a54e7d291f, + 0x8f643a965e91387b, + 0xbe735a198c9346e7, + 0x5c914decbca98765, + 0x42ab983ed97a85c1, + 0x93561beed67c943f, + 0x75b891ffe46fa29b, + 0xd647af843684d219, + 0xfcea78b43284df75, + 0xba2ce4865267fed1, + 0x86ef51d87e6a1d4f, + 0xdc6a8f287c5e2dab, + 0xe514f96cbd715c29, + 0x25f4a6dfec736b95, + 0x8ba5d92fea5679f1, + 0x68b4f9c2174a986f, + 0xe8c913d3254c96db, + 0x5f2de6c8735fc649, + 0x1e82b74a9372e4b5, + 0xc86324acb187f523, + 0x1d39f87cbe59138f, + 0x8b46d15dcd5a32fb, + 0xd17465b1fc5e4169, + 0x34c7e8b32b416fc5, + 0x567d4cf32b658e43, + 0xd297eb6548357c9f, + 0x36c45ad876489b1d, + 0xf4dc7219843dcb79, + 0x589147fba23fc9e5, + 0x8492fc3ed152f963, + 0x26318c7ede3517bf, + 0xd392e6421f49273d, + 0xdf1e3a854e2c35a9, + 0xe15364298c3e6517, + 0xe97261fbac519483, + 0x4e6d2b8ba93482df, + 0xd243816dc837a15d, + 0x4279c6aed427afb9, + 0x5617db91f43bce27, + 0x4d8297a2142fed93, + 0x2e1d439762431bef, + 0xae8d6b487f152b6d, + 0x581c7af76e173ad9, + 0x8d372cfa9d1c5a47, + 0x85f196edca1e68b3, + 0xb73dac6feb42a831, + 0xeacb41d1f713a58d, + 0xefc6d8532716b4f9, + 0x38e7d1f5451ad367, + 0x6eacb488751be2d3, + 0x374fc5da943ef251, + 0xcd745f198ef231ad, + 0xc14d6a5a9ce54f1b, + 0x914e723dcbf64e87, + 0x7bf8431ed8f96ce3, + 0xdf789ac329fd8c61, + 0x89fdea7325ef79bd, + 0xe167c38656f2c93b, + 0x48d95a3763f4d8a7, + 0x645e827ba3f9e815, + 0x54eb18cba2ebf681, + 0x127a4f3a9fbc15ed, + 0xb587a361fde1345b, + 0x54a26eb21de453c7, + 0xa653b2d54ce98235, + 0xcaf1bd2659eb82a1, + 0xe5912b6545ba7efd, + 0x9e6d12b874cf9e6b, + 0x4e3517da94e2bcd7, + 0x9528fdacb2d6ec45, + 0x28673fdfe2d7fab1, + 0x7658d9c543db1a2f, + 0x516a9fd43fce298b, + 0x8fb146c65dc148f7, + 0xdf87ac4a9cd36875, + 0x58b7426a9ac786d1, + 0x642e859cb7ca954f, + 0x5f42c1dfe5cd93ab, + 0x275316afe5bfc329, + 0x4f6a731326c3e195, + 0xf1cb8d3543a5dfe1, + 0x9fa5dc7762b81e5f, + 0xf24a3de65f892ecb, + 0x4c2815687cae4d39, + 0xb5126a4a9db16ca5, + 0xa4df8b3feac58b13, + 0x47193bafe6b5897f, + 0xfc7db25215a897eb, + 0xedba58c324adc759, + 0x37c96eb5439fd6c5, + 0xdba846ea95b2f643, + 0x43958dbba2b6149f, + 0x962fea7cbfa9341d, + 0x249ea68edeac4279, + 0xb8a5c371fb9d61e5, + 0xe794dcb32ca18f53, + 0xa87c9fe329837daf, + 0xd369218547869c2d, + 0xe896ad365467bc89, + 0x4ab5fc99837bcaf5, + 0x3729415cb28fea73, + 0x43ec761ed29318cf, + 0x48a75b2fef96284d, + 0xec5839d21f7836b9, + 0x9ad547b43e9c5627, + 0x6f9c12e54c8e7593, + 0xf3a27d876a7183ef, + 0x6817ef2cb984a26d, + 0x8b457eadc576b1d9, + 0x6ae3c85ed469cf37, + 0x93e82141f26bdea3, + 0x56fce174347efd21, + 0x4e972a3651832c7d, + 0xb8af53654f653be9, + 0xb37dfc598e694b57, + 0x54967cd98d5b69c3, + 0x296f15adcb6e8941, + 0x3f71bacfe851a69d, + 0x6ed9b241f874c61b, + 0xfb7ade821956d487, + 0xbd519f832569d4e3, + 0x3c74e129847cf361, + 0x41e6b379836f12bd, + 0x4ed3869baf74513b, + 0x594cea1cbd354f97, + 0x6ef2b7ddcb486df3, + 0x89bad321fa4b8d71, + 0x9cbe7da2183e7acd, + 0xbd172a443851ca4b, + 0x9f34e7a65643d9b7, + 0x62f4e7dba647e925, + 0xd3e97a5cb34af791, + 0xb524f98ba24b16fd, + 0x6e52d71dce3f256b, + 0x9e1543a1fe3254d7, + 0x36e5b7a21e278345, + 0xd68ae9765d4983b1, + 0x4b5de8376a4b912f, + 0x23a9f8d6562d9f7b, + 0x267c5faa9631bde7, + 0x35d81e2cb723ed65, + 0x153c278ed436fbc1, + 0x72da849fe2491b3f, + 0xa59f7635413d2a9b, + 0x62d387a65e2f4a19, + 0x1e68cda87e126985, + 0xbf5713da9c2587e1, + 0xc15743dbab18965f, + 0x2e795a6ed71a94cb, + 0x6b42a8eed71ec439, + 0x17b94ca1f731e2a5, + 0x87f942c65846f213, + 0x23eacf476538217f, + 0xc3417db763182fdb, + 0xf13c74976dfb3e49, + 0x3df542b87afe4db5, + 0x5cd87febabf18c23, + 0xedb85a6dc9e37a8f, + 0xc49f618ed6e598fb, + 0xfc782b4215fac869, + 0x7c1be45324fbc7d5, + 0x89d71fe764dfe753, + 0xc3b426e984e315af, + 0x68f75e3ba1f7352d, + 0x4e168facbfea4389, + 0xf2bc63dbacdb62f5, + 0xe148ba31fbde8173, + 0xdca1e89329c17ebf, + 0x1df9c5e328c49e3d, + 0x2f9765b436e5bda9, + 0x98bf34e765e9dc17, + 0xca5f986874dceb83, + 0xabfed31872ace8df, + 0xe7f45d3dc1e3295d, + 0x7c2fa85fefd537c9, + 0x8ba95ef21fda5837, + 0xbd196ea32edc76a3, + 0xbe83cf465bce9621, + 0x93f25ed769c1a37d, + 0x21e3f97987c4b2e9, + 0x7df2356cb6c8d157, + 0xa967d4edc4a8dfb3, + 0x7c2e41fed4abfe31, + 0xb361dea323af1e8d, + 0xa76e824651b23cf9, + 0xfa457e943fb54c67, + 0xf74d1c265eb86ad3, + 0xa2d4b1687dbc8a51, + 0x1362ca7cb69e87ad, + 0x4a271cffe8a1c72b, + 0x932e6481f6b3d597, + 0xa859e7f216a7d5f3, + 0xb6a12df435baf471, + 0x714bc397649b13cd, + 0x15da439981af324b, + 0x37ea24da9fa351b7, + 0x19e456ccbda67f15, + 0x967825fedca97e81, + 0x261b35c1f8697bed, + 0xaef39dc2187e9c5b, + 0xf9e4b1743681dac7, + 0xd25cb1e76794ea35, + 0x3f482be87496f8a1, + 0xc429fd6cb49a281f, + 0x7e395dfdc19d267b, + 0x83a67decbd8f35e7, + 0x59a4e311fea28465, + 0x4da1e5732e9684c1, + 0x628531954c78923f, + 0x2671c3d5486ca19b, + 0xa68f7125465caef7, + 0x98d2541ba681de75, + 0x91f6eb7ba574fcd1, + 0x1c9765aed3871c4f, + 0x7341edc1f1682cab, + 0x5268abf4317d4b29, + 0xdf7b34632e6f4a95, + 0x46df38165d6378f1, + 0xf6eb2c498c54976f, + 0xc6fb72d98a4795db, + 0xe7f5213ed86bc549, + 0x95b8a27dc76ed3b5, + 0x85ad692fe781f423, + 0xb412f9643675128f, + 0x83c6af76546731fb, + 0x3d8eb268716a3f59, + 0xb3a591487f3b4ec5, + 0xf2beda5a9c5f7d43, + 0x389cb1fbac427b9f, + 0x58bf9c2feb459a1d, + 0x7c64b3d1f836ca79, + 0x56423da2173ac8e5, + 0x6fabc193274de863, + 0xa7d152e9875216bf, + 0x526e3f1ba475263d, + 0x9b46721dc15734a9, + 0xaf47e28dcf3b6417, + 0x23e95fbdce4d7283, + 0x4971ebadca3e71df, + 0x69e583d21b329f4d, + 0x862bda543824aeb9, + 0x3f2ace765938cd27, + 0xcd516988762aec93, + 0x3f51d698742bd9ef, + 0x7de2315dc5412a6d, + 0x2f5a187fe12438d9, + 0x8967abdfef185947, + 0xac781f432f1a67b3, + 0xe1a2c4d65e2d9731, + 0xe2bcf9765b1f948d, + 0xfdbe59687a12b3f9, + 0x36f5412cba15d267, + 0xe76c915cb728e1d3, + 0xb395164dc62aef41, + 0x64c5dfafe42c1f9d, + 0x2cde73a656324e1b, + 0xd24a981762134d87, + 0xbe2c6f854df56be3, + 0x48ac9de65df98b61, + 0x6eafcb1659fa78bd, + 0xd342618a97fea83b, + 0x5ea6df9dc8f1d6a7, + 0x93a84e5ed8f4e715, + 0x617ec53326e7f581, + 0x5b8d6ec435f914ed, + 0x915c38a874fd235b, + 0x5d6e74a981ef42c7, + 0xbd2f456bafe48135, + 0x76ef831bacd57f91, + 0x1ed7952ba9b67cfd, + 0x2945acd1f7ea9d6b, + 0xad4b5e3216ceabd7, + 0xbea5194438d1eb45, + 0xd7e294c656d4f9b1, + 0x5c3a76b985d7192f, + 0xdf854b6a93ea278b, + 0x5cf4d86ba1dc36f7, + 0xce78436cbecf4675, + 0x6e183571fec385d1, + 0xe36a89421dc6934f, + 0x4ebac8143cd792ab, + 0x12d978f658dbc129, + 0xb12fd3a546adcf85, + 0x796ebd5986a2fde1, + 0xdf5b341ba6b41d5f, + 0x9d641cbfe3a62dcb, + 0xa673b421f1da4c39, + 0xdf316b9321cd4ba5, + 0xa275f9c54ebf7a13, + 0x23cbdf954db2987f, + 0x2ba31e465ca496eb, + 0xd51e9fa87ab8c659, + 0x891af52cb79ad4c5, + 0x734eb59dc7ade543, + 0x84ab165fe6b2139f, + 0x4e89fbc327b6431d, + 0x162ab84653c84179, + 0xa7d9314761a94fd5, + 0x8a4b91776f9c7e53, + 0x32694d865b7e6caf, + 0x4216d8bbac839b2d, + 0x46dc835fea74cb89, + 0x694735cfe687c9f5, + 0x6d3a5ce2168be973, + 0x7f349583247be6cf, + 0xc3e972f986a1274d, + 0xc32a975982a435b9, + 0x67f215ddc1b96527, + 0x659de72dcf8b7493, + 0x36d872bbac6b72ef, + 0x6873bdafeb7f916d, + 0x64cfe7821b62afc9, + 0xf3ebc9d32a85ce37, + 0x6fd8ec354867eda3, + 0xcba9df59867afc21, + 0x42b8571a946e1b7d, + 0xa96dbe1dc4713ae9, + 0xf534691fe1934a57, + 0x4832c79fef5768c3, + 0xf7ed31632f6b9841, + 0x93cadb832e4c859d, + 0xb5d8a9654c6fa51b, + 0x731d4e5a9b62d387, + 0xecf95d2ba976d2e3, + 0xa365e7bdc879f261, + 0x538ca9dfe56a21bd, + 0x3ab29dffe46d3f2b, + 0xd97e1a6323614e97, + 0xde6b947651746cf3, + 0x812d3f965f468c71, + 0x9382b1f65e3879cd, + 0x62deb1387c3da94b, + 0x5ef9cb6ba93fc8b7, + 0x1bfe5a9eda63e825, + 0x5f91763fe845f691, + 0xe6a35743274815fd, + 0xbd287694375c246b, + 0x437c12a9825e43d7, + 0x2c8d71acb3718245, + 0x3b7e68cbaf4582b1, + 0x349f27ebac368e1f, + 0x8b4ae57edc289e7b, + 0x36b57ad1f82bace7, + 0xed429532192fdc65, + 0xf142ea765843fac1, + 0xacd1b43878461a3f, + 0x8e5fc71ba537289b, + 0x4263dc7cb53c4819, + 0x8163e59dc12e4785, + 0x5ea8123dcf3286e1, + 0xdc7f968fed13945f, + 0x8b6914532e1693cb, + 0xedb73f965d1ac239, + 0x48b59ca7692cd1a5, + 0xc34b57d7672dcef1, + 0x6f15becba8231e6f, + 0xde5417cba6152edb, + 0x31b96a4fe5183d49, + 0xc1da6341f21a4cb5, + 0x89e2bf66541e7b23, + 0x16ce74932cde698f, + 0x5e9df6b54ce297fb, + 0xe2437d665bf4c769, + 0x281fd46879f8c6d5, + 0x4eb23c1ba8fbe653, + 0x6f57c4da95dce3af, + 0xf7d6c25fe7f1342d, + 0x8ca4b96216f54289, + 0xab89c63543e861f5, + 0x13e6f29651ea7f63, + 0xa832b7954eca6dbf, + 0x4c8e5f276abf8c3d, + 0x91d3ce8878e2bca9, + 0xed213f4dc9e5db17, + 0x7d4193c1f6d7ea83, + 0x6354a8f215b9e7df, + 0x1ba5f26436ce185d, + 0x6bea485875e136c9, + 0x347bdcfba2e45637, + 0xa831d75cb1e875a3, + 0x61cbf3dbafdb9521, + 0x182e4d9baebc927d, + 0xe3f94c7ed8bfa1e9, + 0x653849e21ab2cf47, + 0x3ce168a328a5deb3, + 0x7f69bc2657b8fd31, + 0x4c2ed3b765ba1c8d, + 0xbd4381c874ad2bf9, + 0xfe76513dc3d14b67, + 0x4b68137fe1c469d3, + 0x35a976bfefc78951, + 0x6afb34d21fb986ad, + 0xf2154eb43e9da62b, + 0x972de1543bafc497, + 0xe6a4c3b879a2d4f3, + 0x32c91edba9b6f371, + 0x8c1a4efcb6a812cd, + 0xb4d7865fe6ac314b, + 0x45cab1ffe29d3fa7, + 0xe9d78a6434b27e15, + 0xdb67283652b47d81, + 0xc54297143f857aed, + 0xce9f63254e789a5b, + 0xfed278465a6db9c7, + 0x5a7df6ecba8fd935, + 0xeb59127ed893f7a1, + 0x9f48ca2fe8a6271f, + 0x6274af9216a9257b, + 0x4cb5e8a3259b34e7, + 0x3d9fe6c982ae7365, + 0xdb2f487a94a283c1, + 0x126f94ebae85913f, + 0x6ec1b53bad659f8b, + 0xf6e25addcb58adf7, + 0xd41e7b51f96bcd75, + 0x78d6f9c3286febd1, + 0x8ec74b2659831b4f, + 0x87c3fad5467529ab, + 0x2ac6df4cb5784a29, + 0xe238f7ccb27c4895, + 0x2c8d563cb28d67f1, + 0xe2b6195dce71956f, + 0x931a6c71fe6394db, + 0xc3978a221e67c349, + 0xf21659743c69d2b5, + 0x58e742d76a7ce123, + 0xe83adc16564cde7f, + 0xdb58431a97632feb, + 0xdb24935dc4763e59, + 0x82c175ffe2684dc5, + 0x42abd5e1f16b7c43, + 0xd57ea9c3214d6a9f, + 0x98b5ec654f52a91d, + 0x4e9a37f65e43c879, + 0xb27fa5998b36c7e5, + 0x8e62d45a9b4ae763, + 0xf84c71da973ae4bf, + 0x3b9de67dc86f153d, + 0x29a8b3e1f76243a9, + 0x6fc7a84329586317, + 0x5ce2d787645a7183, + 0x62e89fb651396ecf, + 0x825f97d76f2c8e4d, + 0x42d5fe687e31adb9, + 0x4b53e81bab34dc27, + 0x526a98ceda26eb93, + 0xb948ed5dc627d8ef, + 0x85f4be33283c196d, + 0x2a1bf535463f27d9, + 0xf73d91cba9325847, + 0x23f48d5ba42576b3, + 0xe17d3a5dc24a9631, + 0xf5ce147baf1b938d, + 0xa9fcde1cbc1da2f9, + 0x9641e371fc32d167, + 0x1cd6afe32a14dfc3, + 0x192b8ac65a27fe41, + 0x2fa96b1657281e9d, + 0xcef24d59872c3d1b, + 0x5dfc4e7ba51f3c87, + 0x8e4af17dc5126ae3, + 0xd783b69fe3258a61, + 0x192df3adcef587bd, + 0xcfb92d721ef9a73b, + 0x51ba6dc32bfdc5a7, + 0x87d63ce54aefd615, + 0x1b248e387ae3f481, + 0x6e1f8c3a98f613ed, + 0x784153edc7f9325b, + 0x9eb2c84ed5fb41c7, + 0xd6fe2b1dc3ed6f25, + 0x19b6f7e434f27e91, + 0xb98a2d3541e37bfd, + 0xdeb54ac43fe59c6b, + 0x9e68ac754ce8bad7, + 0x2156fca879ecda45, + 0xfac3457a97cfe8b1, + 0x1d72b9fdc9d4182f, + 0xea6327d1f7e5268b, + 0x452f38b216d935f7, + 0xd1a754f323ec6475, + 0x9a8b4e7763ce74d1, + 0x621953f983d1924f, + 0x54d83ab87fd491ab, + 0x9f2671e98dc6bf19, + 0x5469c8eedab9ce85, + 0x5a9e84c1f79adce1, + 0x2bc573d2179deb5f, + 0x62e3f5d547d32acb, + 0x1a8b64f657d64b39, + 0xecfab2d873d849a5, + 0x35eb12cba4dc7913, + 0xe1c3658ba1bd867f, + 0x5e9b48fdcfa195eb, + 0x62b54191feb3c459, + 0x3cfe9d721ea7d3c5, + 0xb876f4d65cbae243, + 0xc8ea7db5478be19f, + 0x5381f4e878af321d, + 0x3f5b184ba7b23f69, + 0xace3152cb3a64ed5, + 0x5d9fb16fe2b97d53, + 0x53c87b1fe1896baf, + 0x7d29f864319e8a2d, + 0xb42a71643f71ca89, + 0x57bd81354d93c8f5, + 0xf26971365ca6e873, + 0x87b5d2e76978e5cf, + 0x6f8ea24cb89c164d, + 0xb51c62eed68f24b9, + 0x2ed3b781f8b36427, + 0x3e5db86215b67293, + 0x3b6f51a5439871ef, + 0xcbf65a15417a8f5d, + 0x3ef17d554f5d8ec9, + 0x847e65da9e81cd37, + 0xf6e3d2ba9b74eca3, + 0x78a3c46eda87fb21, + 0xc5be6a11f8691a7d, + 0x6394ec82176c28e9, + 0x9436be53268f3957, + 0xa5ebc719859267c3, + 0x9fd8a24cb3a69741, + 0x6cd8f94cb167849d, + 0x3de48caa9f6ca41b, + 0x3c8dea9cbd5ec287, + 0x347692d1fb72d1e3, + 0xade487332b74ef51, + 0xb14edc7439561fad, + 0x248af9b658693e2b, + 0x417f3be9865c3d97, + 0x528a467a946e5bf3, + 0xa735c62ed4638b71, + 0xca6b83dfe15478cd, + 0x6c93b7dfef37a84b, + 0x6e5cd9f21f3ac6b7, + 0x9b4e51843c4ed725, + 0x5e46c2b87c62f591, + 0xdf1249698a6514fd, + 0x249efabdca58236b, + 0x325e976dc85a42d7, + 0x7b95826fe86d7145, + 0x168ef52ed34e6fa1, + 0xb49e37f324538d1f, + 0xc7f6eab651349d7b, + 0xd2b317954f26abe7, + 0xe2941fc87e2adb65, + 0xe58b34687a3de9c1, + 0x8f6a2b7dcb52193f, + 0x42389b5fea34279b, + 0x8c547bd1fa384719, + 0xe792ac62192b4685, + 0xaf21be65463c75e1, + 0xfd541ec8742e835f, + 0x2a47eb59814392cb, + 0x3c657e1baf26c139, + 0xf7519c8bad17cf95, + 0x4ae7519cba29cdf1, + 0xe539462ed81bec6f, + 0xba52971549312cdb, + 0x9bd352f76a153c49, + 0xda19e28768174ab5, + 0xc63ae82a961b7a23, + 0x8932ed7ba31c678f, + 0x46e2358ba21e86fb, + 0xc13ed47cbef1c569, + 0x7c61593febf3c4d5, + 0x5f6e94221cf8e453, + 0x68d495f439d8e2af, + 0x1394a52769fc132d, + 0x9a148bd767ef3189, + 0x36451caa97d24fe5, + 0x156d3a8cb4f57e63, + 0x8b65f34ba2e76cbf, + 0xc63527ffe1fa8b3d, + 0x7d86c51321fe8ba9, + 0xd5819cb54fe2da17, + 0x79a32ef65cd4e983, + 0x173b892549b5e6df, + 0xa9c56d3989ea175d, + 0xe4bc192ba7ed25c9, + 0x179456adc8df4537, + 0x75369ba1f6e274a3, + 0xe65ac12436e79421, + 0x65ae2fd543e8917d, + 0x38af56c541ca8fd9, + 0x49ab8f265fadbe47, + 0x2abd98f87ca1edb3, + 0xa48b6eca9ab5fc31, + 0x9b8d53ffe9c61b8d, + 0xaf61943fe6c82af9, + 0x85bc234218cd3a67, + 0x83f7cde326bf58d3, + 0xdcf35b2876d39851, + 0x2a486ed872c485ad, + 0x165afdca91d8a52b, + 0xf97aebc98fabc397, + 0xb824635bab9dc2f3, + 0x8dfa651fecb3f271, + 0xf12bdae43ba521cd, + 0xd13ebf7549a72f3b, + 0x3fbc962546b93ea7, + 0xf43a926987ac6d15, + 0x2c7d48ba94af6c81, + 0x54ec723cb3a279ed, + 0x58d7c3ffe1c4a95b, + 0x26b85d4fef96b8c7, + 0xd2e795321f9bd835, + 0xa2cd17643c8de6a1, + 0x8b249c187ca3261f, + 0x25eb6a998ca5247b, + 0xce463f7cb9a843e7, + 0x9bf326aed8ab7265, + 0x2d5164cfe59d72c1, + 0xe147a53dc38d7e2f, + 0x4eca9f6213729e8b, + 0xfd8b6a243184acf7, + 0x8f9adb143f68dc75, + 0x9f68c7d65c69ead1, + 0xc259f1687a6ce94f, + 0xf958e67edc7128ab, + 0xbd24617feba54829, + 0x21b4d9a1f6a84795, + 0xd87b13a3258a76f1, + 0x8e91dc43237c846f, + 0x42d7be16526f83db, + 0xc4b5de6ba183c249, + 0x521a687a9f76d1b5, + 0x8ec1f9bbac68df13, + 0xdc82461cba49ed7f, + 0x41aeb291f85c1deb, + 0x854e9d332b713d59, + 0xabf9764329734bc5, + 0xd9f3ac8659687b43, + 0x42dcb398734a689f, + 0x68cb32fba35c981d, + 0xe21f358dc14fb679, + 0xac419f3cbf42c6e5, + 0x6dc8e351fd47e563, + 0x543276c21c47e3bf, + 0x98231ac65c6b143d, + 0xe3dc98576b5e32a9, + 0xe95b1c6bab836217, + 0xe7f8d61cb9546f73, + 0xb1e625cba4356dcf, + 0x23b564afe2398c4d, + 0xbd57e121f13d8cb9, + 0xc4a79284314fcb27, + 0x4d36c7f65f42ea93, + 0x6489a7365b24d7ef, + 0xc146f5e87c39186d, + 0x954b6df98a3b26d9, + 0x28d795fdca2e3647, + 0x69137b2fe94175b3, + 0x4165ab31f8469531, + 0x546eafd21536928d, + 0x7341ca265438a1f9, + 0x4f8ea9b7612cbf57, + 0xdf79ae576d1fbec3, + 0xc5d4a72a9c23fd41, + 0xf39c784bab251c9d, + 0x7b31ca5fea283c1b, + 0x2db84591f91c3b87, + 0x96d5b3a3281d59e3, + 0xc419a8d65a328961, + 0x4bea2358751386bd, + 0xa16c274a9417a63b, + 0x36c92f4cb219c4a7, + 0xa5d8237a9efbd415, + 0x1e58c47babfde381, + 0x26845f7dcaf312ed, + 0x14f6abe32cf6315b, + 0x7d39bf8329e63fb7, + 0x5ead293548fa6e25, + 0xed396af875fc6d91, + 0x5316a89873ce6afd, + 0x5bf18e3dc3f29a6b, + 0x68da23edc1f4b9d7, + 0x127a386dcfe8d945, + 0x4aecbf532fdae7b1, + 0x6bf715e43abce62f, + 0xa93ebf276ce1258b, + 0x2b6de9598ad534f7, + 0x9a6412ccbae96375, + 0xdf9a876cb6ea73d1, + 0x2c61fdecb5dc814f, + 0x654c173ed2ce7f9b, + 0x8fce746324d3be19, + 0x42cf5d9431e4cd85, + 0x29f3ed154fa7dbe1, + 0x2a3f18654cb9ea5f, + 0x9241fad768ae19cb, + 0x6379124dcbd14a39, + 0x845c1bafe9d348a5, + 0x85164a31f6d97813, + 0x857ade3214ca857f, + 0x89b673e323ac84eb, + 0x8d2a31e762cfb359, + 0xd17be3c981b3d2c5, + 0x5e8132da9fb7e143, + 0xd5f69a887b96de8f, + 0x9b8ae17dca891efb, + 0x94e638c1f8ad2e69, + 0x915b47c329a14cd5, + 0x7db5346329b47c53, + 0xf862bdc434b569af, + 0x318e29a764ba892d, + 0x734fdb2762adb789, + 0x6b814e5ba19eb7f5, + 0x63142f7dcfa2e673, + 0xb1a7839edb85e4cf, + 0x43bca9132ea9154d, + 0xc8b712a54d8c23b9, + 0x3efdacb76bae5327, + 0xb3fc71298ab27193, + 0xcab54f3a95836edf, + 0xcd32f97cb3968e5d, + 0x21c3d75fe2678dc9, + 0xcb67a511f18dbc37, + 0x6d1ab473217fdba3, + 0xec4f78d65e84fa21, + 0xabd381554e85197d, + 0x4f9183c65c6827e9, + 0x18d29c5bab9c3857, + 0x46fea79cb98e56c3, + 0x437b58dfe8a29641, + 0x49b178d1f574839d, + 0x4a7fdb532587a31b, + 0xdbc9a575436ac187, + 0xbc936af6516abfd3, + 0xef4cba287c6fde51, + 0xc625fd498c631ead, + 0xfe83c46bac763d2b, + 0xfa235c7feb583c97, + 0xdb68a24fe86b5af3, + 0xac85f9b3295e6a71, + 0xc8571ab4365187cd, + 0xd9fc73698563a74b, + 0x8c1d3aea9246c5b7, + 0x496c7fecb17ad625, + 0x47e62c3baf5ce491, + 0x386adfba9a4ce2fd, + 0x7ac64e21fd74326b, + 0x8fb1e7c32c5641d7, + 0x6b375ef32b496f35, + 0x327d4616584b6ea1, + 0x753db419864d7c1f, + 0xfc93641ba5419c7b, + 0x4b8da5edc243bae7, + 0x48f5a29fe137da65, + 0xf34e692edf39e8c1, + 0xce2395b21d2be73f, + 0xfc1758254d3f169b, + 0xf1a7be698d534619, + 0x82c19d5bac276485, + 0xe25483dcba3974e1, + 0xd5e7f4bdc73b825f, + 0xf7ac41eed53e81cb, + 0xf68d37bfe541bf29, + 0xc7d4eb921423ce95, + 0x4ceb2d965236dcf1, + 0xa731d9e54d18eb6f, + 0xdc1e43f76e2c1adb, + 0x537bde198c1f2b49, + 0xe721386edc1249b5, + 0xc59b7d4feb167923, + 0xa3d6b95fe519768f, + 0x843b9513261a85fb, + 0xd678aec4351eb469, + 0x7c53a1998621c3d5, + 0xd483e1fba416e253, + 0x1cebf4d87cd5e1af, + 0xeb12df7bacf9312d, + 0xd581ab3dcaeb2f79, + 0x8145fe9cb8fc3de5, + 0x198c6e532af17d63, + 0x9ab4f13327e36abf, + 0x651a87c545f68a3d, + 0xec8f1d9653f7b8a9, + 0xeb9576d983fdc917, + 0x7f9c84eba1efd783, + 0x2c1db6aa9cb2e5df, + 0x3486ad21fce7165d, + 0x4afd53821de824c9, + 0xb3f691432bec5437, + 0xa647b1f659de62a3, + 0xcd16e3a98ae49321, + 0xab528f7a95c38f6d, + 0x78b21c4ba3c58ed9, + 0x85ef3addc2e9bd47, + 0xe2475631f1eadcb3, + 0xc8d91f5542cfeb31, + 0xdac381654fc31a8d, + 0x1b93a2d54dc528f9, + 0x47f6eda65cda3967, + 0xbe6c342989cb57d3, + 0x6f2d875cb9ce8751, + 0xb239c8ffe6c184ad, + 0xa2498dc1f6d5a42b, + 0xb46958d214d6c297, + 0x8b49236654b9c1f3, + 0xefbca27652abdf61, + 0x87b6f3d54a7cfebd, + 0x56e91db98da42e3b, + 0x8eb47a5a9cb53da7, + 0xb1c594afeab96c15, + 0xd62eba71f7ac6b81, + 0x6bfd8a32159c68ed, + 0xab97fd6436c1a85b, + 0x16b4aef654a3b6c7, + 0x2af837ca92b8d735, + 0x3f562a4982b9e5a1, + 0xec6d817a9d8be41f, + 0x8a9654edcd9f137b, + 0x219b64a1fca342e7, + 0xbe8a61332db87165, + 0x76eadcb43a986fb1, + 0x3259bc65468a7d2f, + 0x68e2f9b6546e7d8b, + 0x6284d53a9481abf7, + 0x3f69d82dc293db75, + 0xea9d165dc286e9d1, + 0xf4219dbdcd69e84f, + 0x376acb932f6d17ab, + 0xb71d89e54d8f3729, + 0x9b3ec4687da24695, + 0x6ad7e4298b9675f1, + 0x3476d9fcba79836f, + 0xd362a58dc56a82db, + 0x46517baed57eb149, + 0x68a5b27fe371cfa5, + 0x5b98ae632485de13, + 0xf6bc92743165ec7f, + 0x7b53d8c54f581ceb, + 0xae5bf1d87e6d2c59, + 0xa3fec6598b6f3ac5, + 0xa8c29b5edc827a43, + 0x6149b53eda54679f, + 0xd87153c1f658971d, + 0xa87ef952164cb579, + 0x94586ad3236db4e5, + 0x25d7f48a9581e463, + 0xe1439ba98164e2bf, + 0x74b28d5baf68123d, + 0x2a5981ddce5b31a9, + 0x7b856d3dca4b3ef5, + 0x263f157eda4f5e73, + 0xe4dfb39219426bcf, + 0xab7ec19329358b4d, + 0x5931fab545368ab9, + 0xf246a9d9854bca27, + 0x9524edfba24ed893, + 0xf453d17ba241d6ef, + 0x84b971ddcf34176d, + 0xda2c54e1fe3725d9, + 0xab3dfe421e2b3547, + 0x4fd2c3e65c2d64b3, + 0x62c8f4987b5f8431, + 0x29d3b6f87a43918d, + 0xe9d234cba6248fe9, + 0x85362addc428be57, + 0x3b69275fe429bdc3, + 0xe87ca461f23dec41, + 0x2d8b347653421b9d, + 0xfbad83576f253a1b, + 0xe423a6865e163a87, + 0xf23deb887c1a58e3, + 0x5f37d84bab2d7861, + 0x2b4fe18ba81f75bd, + 0xbf31c69fe812a53b, + 0x61cd8731f615c3a7, + 0xb827de354729d315, + 0x23ec17f7653be281, + 0x94b67ae6521aefcd, + 0x47d395a76cde1f4b, + 0x71a459698cf23eb7, + 0xcbd9347babf76d25, + 0xfc6b98eedaf86c91, + 0x2dab943dc5ea69fd, + 0x768d4f9215fe896b, + 0xb7c214e435f1b8d7, + 0x8da93f1876f3d845, + 0xabd2467983f7e6b1, + 0x1563af4981d9e52f, + 0x857621ca9fed148b, + 0xc3d8765babce23f7, + 0x8413dab1fce36275, + 0xd7be1c643be672d1, + 0x1de73f8329c87e3f, + 0x14bfd86435da7e9b, + 0xc54328f765cead19, + 0x6b43f2ea94e1dc85, + 0xd1426bfa93c4dae1, + 0x61a79cdcb1c6e95f, + 0x635ab2dfefd918cb, + 0x9e5dca821fcd2839, + 0x78e514f32dcf37a5, + 0xc39b71f76cd48713, + 0xf45e8c176ac5847f, + 0x81c534da96c783eb, + 0xf2b794cba6dcb259, + 0x4276e8bed4aeb1c5, + 0x16d5a87fe5b1df23, + 0x2c57edf212a3ed8f, + 0xdcae5b9542a61dfb, + 0x36b9cef54fba2d69, + 0x28a4fde76e9c3bd5, + 0xa67db3998caf6b53, + 0x6ed1a34dc9b268af, + 0xdba5239fe7b5982d, + 0xb8a73ec1f4c7b689, + 0x3e824af2149ab6f5, + 0x14bc53a324aed573, + 0x7b2ca9876491e3cf, + 0xc57b6eaa92b6134d, + 0x1e45b9c98fa732b9, + 0xa48b912dceab5127, + 0x5438a26edb9c5f83, + 0xd186a49cb87e5cdf, + 0xe3c27a621a928c5d, + 0xc8e1479326748bc9, + 0xb6279ae54598cb37, + 0x92c43b87647bd9a3, + 0xde5b146ba48de921, + 0x67ab24ddc3a2187d, + 0xf8e42b9dcf8426e9, + 0x67c18d41fea93657, + 0xe9bfdc821e8a65c3, + 0x249e75a43c9d8541, + 0x8267fea54a6f729d, + 0x3cbef4a87984a21b, + 0x2794681ba584bf67, + 0x9264d7eba467bed3, + 0x1b835e6dc37aed51, + 0xd7c9821fe15cfbad, + 0x28b961a654813c2b, + 0x375468a32f643b97, + 0x2e85c1954d6759f3, + 0xd3b645c98d5b6971, + 0x53ecd629894b76cd, + 0x4f97e5ddc85f964b, + 0x4a6b185fe862c4b7, + 0xba561471f687d425, + 0xf64e9da32568e391, + 0x23c7a9b54359e1fd, + 0xb95f67e9837e216b, + 0xe6534a298e513fc7, + 0x5b81e94bad746e35, + 0x6ecf723cbc476da1, + 0xfe14935eda497b1f, + 0xa5813de1f63d8a7b, + 0xaecbfd22163fa9e7, + 0x9d28e5143842d965, + 0x6dce4ba98645e7c1, + 0x8a276b4a9248e63f, + 0x6e387fdba24c159b, + 0xa8945f3cbf4e3519, + 0xf19e63bede416385, + 0x9de87a31fc4573e1, + 0xc3f9a6832c37815f, + 0x812ebf9439287fab, + 0x6983a416573cae29, + 0x5dfab348762fbd95, + 0x84a1cdfa9643dbf1, + 0x8e7d293cb324ea6f, + 0x1349c72fe23719db, + 0x8b1c9f5fef1c2a49, + 0xd139ac432f1e38b5, + 0x482a95b76e417823, + 0xc5ef23a76c13758f, + 0x4fa981d87a1684fb, + 0x29bd3e5dc81ab369, + 0xecd18b3ba71cb2d5, + 0x5b37dafdc72fd153, + 0x5e9436ddc412de9f, + 0xca5721d545362f1d, + 0xf42e61a653182e79, + 0x6d1589354df93ce5, + 0x962da3e87bfd5c63, + 0xdbc48e9768de59bf, + 0x2d4ac69cbaf2893d, + 0x3fc68e2ed6f4b7a9, + 0x143a2f8fe5f9c817, + 0x7de9f86215fbd683, + 0x81c6a3e323ebc4df, + 0x6ce54f3986f2145d, + 0xe24c657981f523c9, + 0x35d621fbafe95237, + 0x1437c6da9deb61a3, + 0xd534c87a98ba5def, + 0x5fd9734dc8bf7e6d, + 0x645fd87217e28cd9, + 0xdfb698a328e5bc47, + 0x9c3d87e545e7dab3, + 0x421a9b6875dbea31, + 0x4589e13762bcf78d, + 0x4218a9fcb3d127f9, + 0x5914beadcfd43867, + 0x6217ad31fec856d3, + 0x7d46b8e32edb8651, + 0xba157c9329bc73ad, + 0x2193abe658cf932b, + 0xe71a49c768d3c197, + 0xcd3216f986a5bfe3, + 0x4dce8b7ba4b8de61, + 0x3b8f1c7ba298fcbd, + 0xe3759281f2ae1d3b, + 0xf2cde87542d13ca7, + 0xedfc6b143fc46b15, + 0x3d6ec2754ec76a81, + 0xe72ad3954ba967ed, + 0xb21a38e768ad975b, + 0x219865acb69fa5c7, + 0x7d81632fe8b2d635, + 0xb9281451f5b6e4a1, + 0x54fa896325a8e31f, + 0xac27689654ac127b, + 0xbf8154d762ad31e7, + 0xa476cf298ea16f45, + 0xc94a1e598d946eb1, + 0xf19b6c8bab967c2f, + 0x94d17cbfea697c8b, + 0x273f459fe56c9af7, + 0xa7c23bd2168fca75, + 0xe76581a54693e8d1, + 0x4c9daf276395e74f, + 0xfe28b6a8739816ab, + 0x782cda1cb1ac3629, + 0x8435d1fcbf8e3495, + 0x6ed4823dcd9274f1, + 0xc68da25fec94826f, + 0x16afc5932c7681db, + 0x13eb46c32b68af39, + 0x61cb2794376cbea5, + 0xb742fda9867fcd13, + 0xd857c2ea9462eb7f, + 0xd4e2a17dc3751aeb, + 0x83c5a47fe1782b59, + 0x7a4d82bfef6b39c5, + 0x84acdfb21f7e6943, + 0x5e879fd43d51769f, + 0xcb6184e65c74961d, + 0xa5be6c498c56b479, + 0x67c28b1ba869b3e5, + 0x7d4c631cb87cd263, + 0x2e17493ba45ed1bf, + 0x871ba651f685213d, + 0x925d87b213652f89, + 0xf1c256e541683df5, + 0xe3bc81776f4b5d73, + 0xa724c1976b3d5acf, + 0x8653ae7a9c518a4d, + 0x63b4ef7edc43a8b9, + 0x3482ac7fea46c927, + 0x834129b1f64ad793, + 0xe9783c42163ac5ef, + 0x5e9dc843253ef46d, + 0x1cdf24b9856324d9, + 0x96f1372cb1685347, + 0x965bd48baf4962b3, + 0x5a2cde7cbe5c8231, + 0x2175fcdcba2c6f7d, + 0x576c49d1fa318de9, + 0xd5927c321a23bd57, + 0xf68d32a54826dbc3, + 0x98f3bce76739eb41, + 0x19db8e57642bf89d, + 0xef93b45ba54f291b, + 0x8649e37ed1423987, + 0xfe3965adcf1657e3, + 0x6a2479d1fe2a8761, + 0xfae637932e1a74bd, + 0x4f2ae9665c1e943b, + 0x4cb91d576b31c2a7, + 0x48b7532a9a36d215, + 0x56d3812ba826df71, + 0x3476fada9417fecd, + 0x38b7af1ed52c1e4b, + 0xc17fd36fe31f2db7, + 0x1c6e84b874136c25, + 0x1b9fac543ef46b91, + 0x849a12e43be568fd, + 0x1f2d95354cfa986b, + 0xf4ad391658fca6d7, + 0xfc56d98ba8efc745, + 0x4362951dc7f3e5b1, + 0x37f24bedc5d6e42f, + 0x3fc648a325f9138b, + 0xcd942b8654eb32f7, + 0xab91647982fe4175, + 0x8af52c687ed26fc1, + 0x9a236bd98bc47d3f, + 0x53f79e698ae57d9b, + 0x5c94be6ed7e8ac19, + 0x24cb7ea1f6edcb85, + 0x84eb653326bfc9e1, + 0x871adb6436c2e85f, + 0xf3bd128764e517cb, + 0x6df3e5a984ea2739, + 0xf26a1dea91ec36a5, + 0xdf6e4b5bafce7613, + 0x13f26d5cbdc1837f, + 0xa18732c1fac482eb, + 0xb738a6932cd7b159, + 0xedc9b3a327c8afb5, + 0x4e9d361657abce23, + 0x36f7b816549edc8f, + 0xb6de5f3985a31cfb, + 0xd13a692cb3d52c69, + 0x5829bfcfe1c83ad5, + 0x367952cfefbc6a53, + 0xdea876421e9d57af, + 0xb27893154eb1972d, + 0x27e51cf54dc3b589, + 0x1c38d4b769a7b4f5, + 0x3c2afdea98bad473, + 0x68f51b7a958ad2cf, + 0x596dfa2cb59ef14d, + 0x2863d151f5c431b9, + 0x3f758c1323b64f17, + 0xba9f8e6541b95e83, + 0x4bdf79643e795bdf, + 0xc5fd1ae54c8e7b5d, + 0xd7eb12376d718ac9, + 0x241c57eedb94ca37, + 0x3972ac6fe796d8a3, + 0x9ab7c581f69ae821, + 0xa2e648c2148bf57d, + 0x76fbe514348f15e9, + 0x38af472a96b23457, + 0x7d832e1a91a764c3, + 0x32de467cbf9a8341, + 0xde92b6cbae6b719d, + 0x2a39de7cba5c7ef9, + 0x8d6a23c1fa81be67, + 0x5832ef721974bcd3, + 0x294fab843987ec51, + 0x527f8b643457f9ad, + 0x23a49df9857d1a2b, + 0x7c3a12fcb36f2a97, + 0x34e6bf7dc19258f3, + 0x26c753eedf956871, + 0x54cbe711fe4875cd, + 0x2a67d8321e6c954b, + 0x76d4feb32c5ea3b7, + 0x12a643f87b81d325, + 0xd25e16798a75e291, + 0xebd45f798645cfed, + 0x175df84dc4691f5b, + 0x123bcfaed35b2ec7, + 0x468cb1ffe17f4d35, + 0xab9765e542736ca1, + 0xce879d643e457a1f, + 0xd7251c654e36897b, + 0x4873deb65c3ba8e7, + 0xbd1236fa9a3ec865, + 0xfde96a5cb952e6c1, + 0x421ba58dc864e53f, + 0x981732b1f657149b, + 0x4a6ed9f3276b3419, + 0x9e2bf188736d4285, + 0x751fd929835f62e1, + 0xe37abc298d327e4f, + 0x3cfb7d198d247eab, + 0x64f923ccbc37ad29, + 0x651f728fe82abc95, + 0xa368c92fe73dcaf1, + 0x417ef6332831e96f, + 0x2e641ab6573418db, + 0x82714c5ba6372849, + 0x1a7e24ba942a37b5, + 0x47d68a1cb14d6723, + 0xe263978bad1e648f, + 0x46f7e32dcd1283fb, + 0xb9d1e381fd15b269, + 0xb8c69fe43c28b1d5, + 0x9dc1e2a6591acf43, + 0xcab3f6e5461bcd9f, + 0xcf5a6e1a98432e1d, + 0xf9e7d14cb6142d79, + 0x5682af1dc4173be5, + 0x498dacffe21a5b63, + 0x8dfe62adcdea58bf, + 0xe2a96fb21cfe783d, + 0x9d715ce43df1b6a9, + 0x92ebdc365bf4c617, + 0x1c248fe76af7d583, + 0x39dc45b876e8c3df, + 0xbc53a76a96ebf25d, + 0xc73e924cb5ef12c9, + 0x498135cfe6f45137, + 0xf2458cd212e65f93, + 0xce869a1431d75cef, + 0x92eb48543fea7c6d, + 0xd6acfe154ace7bd9, + 0xea4f5c798ae1cb47, + 0x3b1c4deba8e4d9b3, + 0xb41e28ddc8d7e931, + 0x54d7afcfe4c9f68d, + 0xdf9875b325dc16f9, + 0x14a7fb6434df2567, + 0xae7126f984e265d3, + 0x9e1b763ba2e78451, + 0xce81a4276fc872ad, + 0x36a4fce98edc912b, + 0x1e896dfdc9bdaf87, + 0x2c6a7151f8a1bde3, + 0xd983fb1329b4ed61, + 0x65bed3a32695fabd, + 0x6f921bd656d91c3b, + 0x1d98b45764cd2ba7, + 0x7de1825a93cf4a15, + 0x7a61b48dc2d36981, + 0xf138ce2cbfa476ed, + 0x9b624ea1fec8965b, + 0xbe72f3421e9ba4c7, + 0x6c195d432baec435, + 0x2d3fca4769b2e3a1, + 0xda4eb82878a5e21f, + 0x2c7e15dba6c8217b, + 0x62c3fe8cb4a92fd7, + 0x5f74eb3ed2ac3e45, + 0x35972fdfe29f5db1, + 0x3a8fdc6541a37b2f, + 0xe4768d132f947a8b, + 0x48d6cf743d86a9f7, + 0x7ba9c5e54d8bc975, + 0xfad82be7698ec7d1, + 0x426c9dfcb891e64f, + 0x54f13c6fe79415ab, + 0x98e73a61f6b83529, + 0xf9e2d43216ab4395, + 0x8b94ed36549c63f1, + 0x78dca346529e716f, + 0x8eb637f65e627fcb, + 0xc56d4f398d75ae39, + 0xba6c5e4a9c67bda5, + 0xb14723ffe97adc13, + 0x2fba579fe65cda7f, + 0x1bf2dea4387219eb, + 0x1ac4958437842a59, + 0x7b4d21f7649738c5, + 0xc4b3561ba29b6843, + 0x534cfdeba17c659f, + 0x68b273dbae6f851d, + 0x2c561a9ede62b379, + 0xb71de951fc76b2e5, + 0x5d4ce9832c79d163, + 0x51ebd9332748ceaf, + 0x9c5db735475bfe2d, + 0x1df3526ba7612e89, + 0x74fbec1ba6743cf5, + 0x46e372ced2685c73, + 0x8eb53c6ed14859cf, + 0xf5ba497fef3c794d, + 0x3b92ae721e3f87b9, + 0x5c3fb7d54e53c827, + 0xdb564f387c45d693, + 0xfc2457b76937c4ef, + 0x1c362f8a984af36d, + 0xfd8ec7acb75e13d9, + 0x9734cf2fe9815247, + 0xd5e81ac1f47561b3, + 0xe489cbd434587f21, + 0xc98fd61541396e7d, + 0xb85fd9354f2b7ce9, + 0x72acd3476d2fac57, + 0x69f13cd98b42dac3, + 0x2e91863dcb36ea41, + 0x4bf6a18dc826f79d, + 0x43de5971f74c281b, + 0x92def542193e2687, + 0xa59f4238784156e3, + 0xb5ced7fba7348561, + 0x32bc4d1a912673bd, + 0x6975fab98f1a923b, + 0xe52c6dba9e2db1a7, + 0xced65f4cb91daef3, + 0x841d7e91fa23de71, + 0x4ae71b332814fbcd, + 0xf6478bd659281d4b, + 0x1ef63946561a2cb7, + 0x32fd48ba971e4b25, + 0x3d296fadc5326a91, + 0xf15ce29cb21367fd, + 0x2de7836dcef4976b, + 0x685241bfecf8a5d7, + 0x65398c721dfbc645, + 0x25f4ea6439fed4b1, + 0x439c8d5769d1e32f, + 0x48f5b2a879f5128b, + 0x8ef5269ba6e831f7, + 0xc7fe4a9cb4ea3f65, + 0x59c8346ba3fb5ec1, + 0x49ca256cb1de6c3f, + 0x71af286431f27c9b, + 0xe96fcd543fe5ab19, + 0xde1c4ba43de7ca85, + 0xaf6ec4d659dac8e1, + 0xc917a4e768bcd75f, + 0xdec4bf6ba8e216cb, + 0x9ae8217ed8e52639, + 0xc45de281f6e834a5, + 0x8b1cd59326eb7513, + 0x8192eac543dc627f, + 0xf3847db652cf71eb, + 0xbf3a78d76ec2af49, + 0x1cfa46587dc4aeb5, + 0x243a6e8a9ab8cd23, + 0x46fd398dc6a9db8f, + 0xa591437ed58ce9fb, + 0x1af46c7438d12b69, + 0x46ed951327c439d5, + 0xf9123ae874d86953, + 0x263418d872c956af, + 0xebd384fa91bc862d, + 0x8ebfa6287ebfa489, + 0xe96317ddcda2b3f5, + 0xead1b851fcb6d273, + 0x6b973d532a97d1cf, + 0xfe154a932789ef3d, + 0xe3acb985468d1fa9, + 0x417ea32a98b24e17, + 0xe65cf1dba6b45d83, + 0x39f781ccb2965adf, + 0xbf96c7afe1b97a5d, + 0x42b8951fef6d78c9, + 0xca7f32e21e8fb937, + 0x63e1a9c54e92d7a3, + 0x364f1dc65ca6e721, + 0xc4ae63b65a98f47d, + 0xe81536dba78b14e9, + 0xd1283a4dc8ae2357, + 0xa37f918fe7a162c3, + 0x6b73e9d1f5b68241, + 0x73ab9d5212956f8d, + 0xc4629d7431687df9, + 0x84e9d7f43f5cad67, + 0xb81ae2965c6fabd3, + 0x73bfc24a9c83eb51, + 0xc697ed1cb964f8ad, + 0x7c8453afea78192b, + 0x1b743521f56c2897, + 0xa29cd462168d47f3, + 0x6f3e98d545a28671, + 0xb352a147628374cd, + 0x8d523fbba187934b, + 0x56c32b998f59a2b7, + 0xdf91264bae7dc125, + 0x1e2ac74cba5ecf81, + 0xe836a51cb852fced, + 0x734bac832a761e5b, + 0xf87425b439582dc7, + 0xf28b3ec7687b4c35, + 0x149cfe39846e5ba1, + 0xe231564cb462791f, + 0x17b8ea3ed153987b, + 0x2471ed5dcf35a6e7, + 0x6a497ed1fe3ac765, + 0x3719a5b32e4bd5c1, + 0xc4b965d32a5ed43f, + 0xa9db3f487c64139b, + 0x64fd7ecbab674319, + 0xe281743dc96a4185, + 0x8d75c39cb64a5fd1, + 0x9e47a36cb23c6d4f, + 0xdb356281f2417dab, + 0x21a7b6e43154ac29, + 0x92465df43f26cb95, + 0xb97d2f165d38c9f1, + 0x23c1f9765a2bd86f, + 0xd64b32f8782ef6db, + 0x7435aefedb532749, + 0xd96c134fe92736b5, + 0x526917d1f84a7623, + 0x6f782a42152b638f, + 0x2d78bc96543d72fb, + 0xf7dbce198342b169, + 0xf19485d87e13afc5, + 0x8d7f62ea9d17ce43, + 0x369db5498a17dc9f, + 0xf3e1a5bdc82afb1d, + 0x5db7132fe82f1c79, + 0x51b2a8f549123ae5, + 0x6b29c7f549175a63, + 0x43e5fab7641857bf, + 0x58126dfa941b873d, + 0x348957ccb21e85a9, + 0x2371b8ca9defb517, + 0x4691dc7cbcf2d483, + 0xa368271cb9e5c2df, + 0xf8156ae32ae8f15d, + 0x6e59c72548fb21c9, + 0x78f32ac658ed3f27, + 0x16e52cd987f15e93, + 0x624eb75984d35bef, + 0x658f3d2ba2f57b6d, + 0x236eab8dc1f87ad9, + 0x17628fedcfedba47, + 0x8f2d67c21edfc8b3, + 0x312a7ce65cd4e831, + 0x7caf68d43ac4f58d, + 0xce81a7f76ad815f9, + 0x51bdf9cba9ec2467, + 0xf2ebd81ba7ce54d3, + 0xc8fa519ed7e28351, + 0xa925d671f3e471ad, + 0x84e5c6d323d68f1b, + 0x5f78642431d9ae87, + 0xd7265cf54f9bace3, + 0x1b834de65bafdc61, + 0x19cd38e768a2f9bd, + 0x27354e1dc9d61a3b, + 0xd6a1982fe6d829a7, + 0x8c157631f7dc4915, + 0x1e75934326ce5781, + 0x65ef79a434b175ed, + 0x96fa5db872d3945b, + 0x6f57bcd981d6a3c7, + 0xdcfeb5198fbac235, + 0x15d746e98e9cd2a1, + 0x6eb4a53a987cbefd, + 0xa478312fe9a31f6b, + 0x3d9eb7a219a52ed7, + 0x7d1fa56328b93d45, + 0x52edc785469a5cb1, + 0x4eadb898749d6a2f, + 0x136c95fba3c1798b, + 0x64795bddc1b3a8f7, + 0xf3c9e62edfa6c875, + 0xa816be91fe89c6d1, + 0x4af6cd821c8bd54f, + 0xbf7d8413297ef3ab, + 0xc23465887cb53429, + 0xe4c2b7698ab74295, + 0xf86a91ecb7a962f1, + 0xf2e4d81cb38a6e5f, + 0xbf394ceba27d6ecb, + 0x173b4681f281ad39, + 0xac1b8e632183bca5, + 0x5a1e96854f87db13, + 0x9d5a24843c58d97f, + 0x7cb8a1d5495af7eb, + 0x7e91c26bab7f1859, + 0x98735bceda9237c5, + 0x61bd237fe9a86743, + 0x926a4cdfe378649f, + 0x1a8b3943257b841d, + 0xb17d5f35436ea279, + 0x362adb987382b1e5, + 0xeaf256d98e74cf53, + 0x8a524c687b45cdaf, + 0x27a136da9a58fc2d, + 0x39ba18ffea5c1d89, + 0x2bc651aed86e2bf5, + 0xa5bf27d21a825b73, + 0xe5d67c13276458cf, + 0xde3f78476359784d, + 0x6dc54a98724c86b9, + 0xd52947eba15eb627, + 0x6e219fdcbf61d593, + 0x3f2189ebab54c3ef, + 0x4fd837cfeb47f26d, + 0x1c456a243c5a12d9, + 0xec23ab465b6d3147, + 0xf74c21e7685e4fa3, + 0x1965cebba9647e21, + 0x5912748ba5346c7d, + 0x64289dbdc2367be9, + 0xcf4251bfe13cab57, + 0x87c169fedf2eb9c3, + 0x89fbdc243f52e941, + 0x297b5a354c23f69d, + 0xfd438c976d48271b, + 0xcf7d5aba9c3b2587, + 0x19863ceba92c45e3, + 0x8d2315adc93f7461, + 0x458f12cfe64372bd, + 0x283c56a1f546913b, + 0x52c973621326af97, + 0xd89a27c65129adf3, + 0x82ba91365f2ecd71, + 0x25e89c476b21facd, + 0x54eaf82a9d251c4b, + 0xc574b32edc162ab7, + 0xbfd39a8fe91b4a25, + 0x37ed4281f72d5891, + 0xa9783c63271e56fd, + 0x2bf9eca54712956b, + 0xb62e7d998315a4d7, + 0xcb7f92eba219c345, + 0xebd842c87ef9d3b1, + 0xba214e998aebd12f, + 0xc4f7a83a98cdef7b, + 0x379f5b2dc9d32fe7, + 0x3fbd49521af73e65, + 0x81d2e4b437f85dc1, + 0xcd56b39545ea6b3f, + 0xa4e28f6653fe6a9b, + 0xc61249f984f2ba19, + 0x2f9d8c3cb1f3c985, + 0xe73fd85bafd6c7e1, + 0x7da34f1febc9d65f, + 0xeb54693219daf4cb, + 0xa593cb654bdf1539, + 0x214c63587be243a5, + 0x3fd6ce1a9ae87413, + 0xb1ed456ba5d9617f, + 0x59267bd983c96fdb, + 0x5d13a2ccb2cd8e49, + 0x91c453e1f2e1adb5, + 0x16dfe75541e5dc23, + 0x8d7b4ef32eb5da8f, + 0x9176fcd43ca7e8fb, + 0x8f19ed465bcd1a69, + 0x93f561e879bf28d5, + 0x9264bf1dcad26853, + 0x4e21acbed7c465af, + 0x2d7bc811f4c9852d, + 0x5b7f943214dca389, + 0x271a3fe543bda2f5, + 0xeb5176f984c2d173, + 0x9fd63c165d83cebf, + 0xa81e4fb87b96fe3d, + 0x6ea8b2387cb81ea9, + 0x984d215fe9ac3d17, + 0xd9a81b5fe7af4c83, + 0x3927afb217a259df, + 0xcb43f5a326b4795d, + 0x5d3fb2e543b687c9, + 0xf8ba39d762acb837, + 0x1a9f5769819ec6a3, + 0x832d1fccbfa3e621, + 0x76fc3e2cbc94f37d, + 0x856d7b11fca713e9, + 0x89de53b21dab3257, + 0xa97e38f54a9d51c3, + 0x6f8e31a6589e6f31, + 0xd41659e875926e8d, + 0x4395bfdba3847cf9, + 0x9cf65eaed298ac67, + 0x164cbf9fe179bad3, + 0x483ad6fdcf7eda51, + 0xa31e9f532e61f7ad, + 0xca79eb354e95182b, + 0xb87ef6c54da82697, + 0x483d62e87b8a46f3, + 0x68ca1fdcba9d6571, + 0x86b3475ba57f63cd, + 0xcb35d29fe683924b, + 0x41ed9721f385a1b7, + 0xa5d1e9b32378bf15, + 0x385c12f5426ace81, + 0x64d2e5f43f4acbed, + 0x15f3ca798e721d5b, + 0xefc183da9d642bc7, + 0xb463251edc784b35, + 0xcd13256fe86b59a1, + 0xb937cf6fe75c681f, + 0x6cb35d82154f867b, + 0x5f8b17643462a5e7, + 0xd8153f7a9287c465, + 0x436a751a9268d4c1, + 0xc9476b398e5ad23f, + 0x4f72d6598c4df19b, + 0x9236af5fed734219, + 0xbc9d7f2feb643f75, + 0xefb19d432a475ed1, + 0xbf9531d328396c4f, + 0xf2e9adb5453d6cab, + 0x9da18bf8754f8b29, + 0x528efc7cb342ca95, + 0x8d4ea92cb245c8f1, + 0x1fc49dacbe28d76f, + 0x495c37dfec29f5db, + 0x1c5a74f32d3e1649, + 0x5de8b6f87d6134b5, + 0xe834bfca9c467523, + 0x7c52a36a9a37628f, + 0xd41ef78ba63971fb, + 0x48c62dfcb42c8f59, + 0x76dafe2cb32f9ec5, + 0x359cd6a1f152cd43, + 0xdca259643124db9f, + 0xdb93e5154e27fa1d, + 0xc8bfa9765e2c1b79, + 0xea95b4187b1d29e5, + 0xcae61f7cbc215963, + 0xb4532fadc91356bf, + 0xf1827cbfe917863d, + 0xba648971f51b84a9, + 0x95a61e74362db417, + 0x7ef52cb7651fc283, + 0x682eafc87423c1df, + 0x9fb78c276bc3ef4d, + 0x8921ceb87ce61fb9, + 0x2ce1f57a9bfa3e27, + 0x3c792f5cb8fc4d93, + 0x45f178acb6cd4aef, + 0x8a5cb6e218f27a6d, + 0x5a798bc325f478d9, + 0xd7394f2653f8b947, + 0xa3dc294762fac7b3, + 0xfc67da4a92fed731, + 0xe8da15fa9ec1f48d, + 0xd937fe2cbcd514f9, + 0xeca3d161fce92367, + 0xe26d9b321bea52d3, + 0xc87125954aed7251, + 0x5c96872436be5f9d, + 0xae596d8876d38e1b, + 0x3ac85fda93e4ad87, + 0x3a745d6a92d7abe3, + 0x897e3f5dc2eadb61, + 0x3e2b165baf9ce8bd, + 0xdcf357e54fd2193b, + 0x1498adc43ed428a7, + 0x83af2c476cd94815, + 0xc5ae4b387adb5681, + 0x15f64b2987ab64ed, + 0xd126c5fba6cf835b, + 0x7b3ad25fe5d3a2c7, + 0x14adb9c1f4d7c135, + 0x61a5fc3323b7cf91, + 0x1b7ef4243198bcfd, + 0xf4e1dc943e8cfd6b, + 0xde897f276ea12cd7, + 0xd4fa317a9db63c45, + 0xfc56e9bed9c75ab1, + 0xa423e9ced7ba692f, + 0x75c932d1f4ad678b, + 0x8a73fd6214ae96f7, + 0x1459ca6434b2c675, + 0xaeb5182873a6c5d1, + 0xc624d31871a8d34f, + 0x35849b776e79f2ab, + 0x71ce289cbdae1329, + 0xf496b87fedb24195, + 0x41679f8eda945fe1, + 0x792a63c21a976d5f, + 0x34fab8e325786dcb, + 0x95cb6a75457d8c39, + 0xc9dbe327637f9ba5, + 0x587cf29cb594da13, + 0x87e13afcb194d87f, + 0x9cbe158bad57f6eb, + 0x7ed23cb1fe8c1759, + 0xf3e2d9421d8e26c5, + 0x9e1dafb65da17643, + 0xc397ba665b84639f, + 0x145ade276a97831d, + 0xaf329bddc56ba179, + 0x8ed5b34ba36b9fd5, + 0x6f89214dc27fbe53, + 0x8943caffe162dcaf, + 0xc54b86f43175fb2d, + 0xca258e143f571c89, + 0x758efad54d6b2af5, + 0xe74391698c6e4a73, + 0x3a57d4ca9a6157cf, + 0xa23d64bdca63874d, + 0x7bd6859fe74685b9, + 0x358a76b1f46ab527, + 0x45b92632156dc493, + 0xe2159a65435db2ef, + 0x241fac698273f16d, + 0xef9b27598f5621d9, + 0xb3c81e5bad592f37, + 0x57a364ea9c5b4ea3, + 0xfda2413dca5e6d21, + 0x3856e191f9416b7d, + 0x657d92e218437ae9, + 0xcd19af732836ba57, + 0x3aeb49176549b8c3, + 0xd26f5aea935cd841, + 0xd1579cb9813fe59d, + 0xa923457dcf54261b, + 0xef3586bede362487, + 0xd2eb6131fc2954e3, + 0xe9df6b432d4c7361, + 0xd5cab825493e61bd, + 0xd5f1c43769418f2b, + 0x5eb7fa698623ae97, + 0x52a83f4a9526acf3, + 0xf6ae782cb439dc71, + 0x1e56c97cb12ae9cd, + 0x5a86d43dcd1ef94b, + 0x79326bd54f1329b7, + 0x5d283a176e174925, + 0xe4a3f9c76d2a5791, + 0xad8e9318791a65fd, + 0xb2d5167ba91e846b, + 0x23b7598dc821a3d7, + 0xa825419fe816c245, + 0x692d75b1f537d2b1, + 0x259dfb443428ce1f, + 0x6978cdf5421afe7b, + 0xfd597c354bfc1de7, + 0xbd1cf4698cf13d65, + 0x375d42698af45bc1, + 0x24a65cdcb9e76a3f, + 0x14c8e5aed5fa689b, + 0xfdb3c78fe5fda819, + 0x3b8f49d214efb785, + 0xbf16eac545f3c6e1, + 0x5e4d1cb872e6d45f, + 0xd348e7b761e7f3cb, + 0xd215c6498fec1439, + 0x6ecaf78a9cde32a5, + 0x1eba263edce47213, + 0x5e81ba9ed9c35e6f, + 0xef4376a218c56edb, + 0x79f5c4e326ea8d49, + 0x61472fd434ed9cb5, + 0xe594bfd875dfcb23, + 0xc129e38873c2d98f, + 0x17df28ca91c4e7fb, + 0x87249ebdcfda1869, + 0xb41385d1fecb27d5, + 0xedf3a9421dce4753, + 0xefb196a43bc164af, + 0x19a4d8276ac5842d, + 0x18dc726657d6a289, + 0xf7ec42d986c9a1f5, + 0x7234cd6a94acbf63, + 0xa476b12a928eadbf, + 0x4517c8dfe1a2fc3d, + 0xa14f928432c51da9, + 0x826f5e154fb93c17, + 0xed67ca965eac4b83, + 0xa8b43f965a9c48df, + 0xdae6154a9ab1785d, + 0xec7ab64ed7b386c9, + 0xc742d18fe5c8b637, + 0x14b9c7d1f4b9c5a3, + 0x5f17928436acd521, + 0x78fb1935439fe27d, + 0x912ab3c873b412e9, + 0x57b8c31a9fb83157, + 0xd4b6e8187d984fb3, + 0xd3b7c9ebac9b6e31, + 0x43a8d51cb97e5c8d, + 0x3f9a475fe6817bf9, + 0xf768eb221893ab67, + 0xb8dc19632586b9d3, + 0xd418b9f7648ad951, + 0xbf978416527be6ad, + 0x7d8c5e3a918ef62b, + 0x9ea164fdcfa32597, + 0x8f15b36dcd9745f3, + 0xab254681fd9a6471, + 0xc7fe32921b7a62cd, + 0xbc19f8443a7e814b, + 0x2769be5548619fa7, + 0x1e524c8a9784be15, + 0xcfbd65eba476cd81, + 0xb3e4158a9257caed, + 0x867c52fed16cfa5b, + 0x43eb259ede5f1ac7, + 0xf327d8521f824a35, + 0x2cf41e743e7658a1, + 0x5d21c9f54c59671f, + 0x94b52fa76a4c857b, + 0x74b9df1ba85d94e7, + 0xbf8e576ed981c365, + 0x8cfd3b6fe675d3c1, + 0x7a3c985fe467d13f, + 0xf594cb321247ef8b, + 0xcfe15b75425b1ef7, + 0x58a2bd976d4f2e75, + 0x6cab9ed98e635cd1, + 0x1724deca9c356b4f, + 0x264cae5edc3769ab, + 0xdf9a82bfe74c8a29, + 0xc3a5e941f63eb895, + 0xc62a54d43852c7f1, + 0x6fba84c32743d56f, + 0x4fb165387236f4db, + 0xb45e31cba26b1549, + 0xd4ba6c2a9f4d23b5, + 0xf561daccbd5f6423, + 0x8327bfcedc43618f, + 0x3e9174bed9246feb, + 0x4e2da8621b278e59, + 0x475dbe14372a9dc5, + 0xd9847a17672ebc43, + 0xf24b5c987531da9f, + 0xd192e76ba534f91d, + 0x26e7bc9ed2361a79, + 0xe345a9ddcf1a28e5, + 0x9742ab31fe1d4863, + 0x4f359c832c1e45bf, + 0x5fb34ca76c12853d, + 0xed5c71876c1583a9, + 0x41d6cfa98a29b317, + 0x1b956ceba72bc183, + 0x6d5f3179841baecf, + 0xd1785e9cb521fe4d, + 0xcdb28971f3241eb9, + 0xb93f41a654183d27, + 0x5891ceb32ef84c93, + 0xae71fb643bda49ef, + 0x36ba2d554afe596d, + 0x873bcd276af187d9, + 0x928f514dc9f3b847, + 0x3f594aeed5f7c6b3, + 0x94db31ffe5fad631, + 0x682ae57214fbe38d, + 0xa7cb918543cde2f9, + 0xb6de347a91f43267, + 0x7231ace98fe751d3, + 0x9436c2198cd96f41, + 0x4f693e1878ca5e9d, + 0xe1b827dba8ce7d1b, + 0x9e5c4231f6e1ac87, + 0xfb6ce59217d4bae3, + 0x7cebfa9435e7da61, + 0xebc72d9543c8e7bd, + 0xc5f741a762dcf73b, + 0x74fcabea92df16a7, + 0x659e834cbfd34715, + 0x195f64ddced76581, + 0x184c5921fab863ed, + 0xc5f683721adc825b, + 0x1c4e97a438be91c7, + 0x4b1e8fa768c1bf25, + 0xc432a5e876b4ce91, + 0x69da3f887395cbfd, + 0xc76feb8a92a8fc6b, + 0x4bc6a15fe2ac1bd7, + 0xc6f513eedeaf2b45, + 0xd96a35432fc359b1, + 0x46751f243db5682f, + 0x1d2754a43dc9768b, + 0xf15ec9d548ab95f7, + 0x712ef8aa98aeb475, + 0xe834561cb7a2c4d1, + 0x451ef82dc6a5d24f, + 0xd836a7bfe396f1ab, + 0x36157b2545cb3129, + 0xb6d1c8f541ac2f85, + 0xcae762465c8f4de1, + 0xfa561bc87d926c5f, + 0xd86391487d846acb, + 0xe1f65caedca78b39, + 0x42bdc5afe67cb9a5, + 0xa64dc731f68ec913, + 0x367481e32591d67f, + 0x3ac65bf32483f5eb, + 0x5a1d28e873b81659, + 0x62ac47f9819a24c5, + 0x1befc42baf9d6543, + 0x639b428bac7e529f, + 0xfba8625fec94821d, + 0xfc2391dfeb748f69, + 0xe6d9a5221a679ed5, + 0x1534bce3287abd53, + 0xa8f19b24345dcbaf, + 0xedc46b398571fa2d, + 0xb7a4f96dc3741b89, + 0x246753adc18729f5, + 0x187ea5bedf6b4973, + 0xd826435fed5b46cf, + 0xe9a5f8b21c5f764d, + 0x6ce57df43d6284b9, + 0xfb438e965c86b427, + 0x854a3d987a68c293, + 0xb461c3298659b1ef, + 0xb4c1a7ea934bcf5d, + 0x1a45f79ed4621fc9, + 0x41ad7c51f1852e37, + 0xa53d476321674da3, + 0xf3e261b54f5a6c21, + 0xb6d7f9354e3c5a7d, + 0x9b4ae6f65b3f68e9, + 0xb475e2fbac42b957, + 0xca3951bed945b7c3, + 0x5b4f827fe859d741, + 0x9d1ab471f53ae49d, + 0x8375fd43265df41b, + 0x764d1caa95612387, + 0x1a4b326a917652e3, + 0x376ebc1baf497261, + 0x12d94fe87c285fad, + 0xd53f1b7a9a3c7e2b, + 0x694d1f8dca2f8d97, + 0xb5d96f8fe842abf3, + 0x469f8d732935db71, + 0xf6a1d8e43526e8cd, + 0xd82e7547652af84b, + 0xabf3248a943e18b7, + 0xf2d5173dc3614825, + 0x6975f8bdcf245691, + 0xa231687cbc1764fd, + 0x1ebd57a1fd1a836b, + 0x59b1c7843b1c92d7, + 0xe3d217976a2fb145, + 0x75fd13c76823cfa1, + 0x17ce4b998725cd1f, + 0xdf16382a9416fd7b, + 0x5a7e382cb42a1ce7, + 0x9aeb475ed31e2c65, + 0x84cd25fcbdef4ac1, + 0xce9748a21de2693f, + 0x639afec32df4679b, + 0xd5679c354cf8a719, + 0xe79128f549fcb685, + 0xf4e53b1987fdb5e1, + 0x9b7efcdba7e1d35f, + 0x61ced98ba5e4f2cb, + 0xc27ba38fe5f81239, + 0xdf54be9324fb31a5, + 0xeba782f652db4ef1, + 0x48f61ec43cbe4d6f, + 0xc63917265ae26cdb, + 0xec485a187be58c49, + 0x54f92abdc8e79ab5, + 0x735e1cbed7ebca23, + 0x38f247bfe4bdc78f, + 0x37c4ab9325c1e6fb, + 0xda17e62435e41769, + 0xc3bf291873e826d5, + 0x4ed157ca91eb4653, + 0x29cb5a887ebc53af, + 0x3f7e6baa9cbf732d, + 0x98f65d4fecd3a189, + 0x79b6ca5ed8b49fe5, + 0xed25f68219c8be63, + 0x17b9ea832598acbf, + 0x2b6f3d15459ceb3d, + 0x5c6df4a875d21ca9, + 0xbf8ed71ba4d53b17, + 0x52a348fdc1d74a83, + 0x7c5df81cbea947df, + 0x7d4c16a1feac675d, + 0x835b9ad21daf75c9, + 0x2fc1b5354dc2b537, + 0xcdbe3a4659b6c4a3, + 0xfe14c62878b9d421, + 0x67ef94a9859ae17d, + 0x3dcba269837befd9, + 0x4386c72ed5b12f47, + 0x367e21c1f1a54eb3, + 0x83e2bda542b86d31, + 0xefab1d532f795b8d, + 0xa2e95c443d7c6af9, + 0x16d528754c8f9a67, + 0x98f345287a92b8d3, + 0x87b96a3dc9a6d851, + 0xd5467abdc487e5ad, + 0x81b54d6fe48af52b, + 0x6e9b4f7325ae1497, + 0x9fe16a2876a154f3, + 0xd83feb7a92b56371, + 0x6d3e1b865f8761cd, + 0x7291cea98d697f3b, + 0x64583efa9b5c8ea7, + 0x2e69f73dc97fad15, + 0x6ec728d1f973dc81, + 0x3f8946721764c9ed, + 0xe1db36732467f95b, + 0xa9de7b36546b19c7, + 0x51eb3c4ba48e2935, + 0x8e67d4bdc39257a1, + 0xa476d51cbe84761f, + 0x71fc4a3ede56847b, + 0x48c1b5a1fc5a93e7, + 0x3afde7621c7db265, + 0x918dc2e5496fb2c1, + 0x28efad765863ce2f, + 0xf85ab2687654fe8b, + 0x5cfb138ba4581df7, + 0x5e19df2dc36b2d75, + 0x3af62d1dc26e4bd1, + 0x68bfa27ede516a4f, + 0xb86da4521f4368ab, + 0xa7bc8e143e46a829, + 0xc29a8ed54d3ab795, + 0x8f3591c8794cb6f1, + 0x168a45fa983ec46f, + 0xd58be41ba752f3db, + 0xd1b4892fe8671349, + 0x387c1a51f46932b5, + 0xa3fec725457c6123, + 0xb9317a26513c4e7f, + 0x2f7b1ae65f316deb, + 0x83ce2a987e238d59, + 0x1e7539498d269bc5, + 0x291b648eda29cb43, + 0x7b18e5aed62bc89f, + 0xfda87b6dc63fe81d, + 0x74fcaeb32a431879, + 0x297a5185483627e5, + 0x8fda5b4a952a4763, + 0x43daf699812a54bf, + 0x71dfb35a9f1e743d, + 0xf876d12dce3182a9, + 0xb89d671fed35b217, + 0x9c6dbf8fea16bf73, + 0x31e7a6b32817adcf, + 0x956f7de4371aec4d, + 0xdc1b8265451efcb9, + 0x14dfeb9ba8143c27, + 0x1ef973adc5164b93, + 0xd38eaf5cb21748ef, + 0x27c4ae6cbefa586d, + 0x4b3d85cfebfc76d9, + 0x9c6f5ed21cefa647, + 0x9eb76a854af2c5b3, + 0xafce9d276af7d531, + 0x863ec19656f7e28d, + 0x3c1e49d875dae1f9, + 0xa95431ccb5fe2167, + 0x9e328facb5e14fc3, + 0xae2b917ed2f56e41, + 0x7abec16321f65c9d, + 0x84297e643fe97c1b, + 0x6f7adeb43ced9b87, + 0xfabd374658cfa9e3, + 0xd2964a598ae3d961, + 0xae6f247a97c4e6bd, + 0xfad7e13dc5d8f63b, + 0x13b57a91f4ec15a7, + 0x8531d74327de3615, + 0xfb348ce875e26481, + 0xb49a61c871c462ed, + 0xb18ec4976fd7815b, + 0x34dc6e765dc98fb7, + 0xeb6573f989bcae25, + 0xe173b94dc7afbd91, + 0x5619a37fe692cafd, + 0x4378b95217c4fa6b, + 0xaed27f4435c81ad7, + 0x83ead2f876dc2a45, + 0xfde23a6873ce48b1, + 0xcb3d819ba3c1672f, + 0x8673ebfbafc3758b, + 0x14b9e27dcdb694f7, + 0x3d25ac71fdcab375, + 0x6d8954f32a9cb3d1, + 0xd615f7c4389ec14f, + 0x2dc89bf54682ef9b, + 0x2e9a76f987b62f19, + 0x874bce6ba4b92e85, + 0x79fa26ecb39a4ce1, + 0x3fa4beddc19d4b5f, + 0x317cab2fef8169cb, + 0x7b2d8a321fb48a39, + 0x374895d32e96b8a5, + 0xf19bd7865d9ac813, + 0x253b8a75498bc57f, + 0xa63cd759867fd4eb, + 0x678a2e3ed8b31459, + 0x4d6f871fe6a723c5, + 0x43e6a781f5ba6243, + 0x5e9b8343238b519f, + 0x49e67c24317c5efb, + 0x7bad62f54f718e69, + 0xb13a54876e739cd5, + 0xa468b53a9d87bc53, + 0x56ac971cb857c9af, + 0x319587fdc76be92d, + 0xfc1ab97ed45ef789, + 0x8c9d5342179328f5, + 0x1df7a8b325a64873, + 0x819b7ae7627845cf, + 0x87e3d61a918b754d, + 0xa32cd1e98f5e73b9, + 0xf6b5149dce81b327, + 0xc3d7529fed75c193, + 0x38a9bd2dc845aedf, + 0xa78c56921948ce5d, + 0x8f14e793264afdc9, + 0x7a823ce6586f1d37, + 0xdc21aefa96724ca3, + 0x697a3b4dc4876b21, + 0xd6fa128dc148597d, + 0x7a21645dcf3b67e9, + 0x3d52bac1fd3ea857, + 0x6b937cd32e51b6c3, + 0xe975d6843c75d641, + 0x16fe92365a46e39d, + 0x914d26887859f31b, + 0x8e3427dcb95d1287, + 0x4893cefcb76f41e3, + 0x47b923eed4736f51, + 0xbc296ea1f1345ead, + 0x97af51b431487d2b, + 0xce41f7843f2b8c97, + 0xa1b73ec65c2d9af3, + 0x3452fbd98c42da71, + 0xa5973c298923e7cd, + 0x3d7a819dc926f74b, + 0x574cdb9fe83a16b7, + 0x72349b51f84d3725, + 0xbc1375d3273f4591, + 0xafc21698754263fd, + 0x6c851fba9135826b, + 0x9e8374576f2891d7, + 0x24b6ed798d1baf35, + 0x963cfe19892dbea1, + 0xa15e29dcb932dc1f, + 0x3ca14dbfe813fc7b, + 0x6a1597b439261be7, + 0x52e79315481a2b65, + 0xaf1b28e8762d49c1, + 0xed53628a941e583f, + 0xebd7891dc312769b, + 0xfa5e16dcbef4a619, + 0x9e1b5f3dcdf7b485, + 0x1ec2843edaf9b4e1, + 0xcd85694219ebc25f, + 0x15f2a49437dfe1cb, + 0x2845ce387af52139, + 0xf2d39a1987e62f95, + 0x1cf7845a95e84df1, + 0xce62534a92ea4c6f, + 0xb23f56aa91fe5adb, + 0x78c369fedfe18b49, + 0x54da8e621fe3a9b5, + 0x3256c8a54de7c923, + 0xfc5718243ad9c68f, + 0xfb89376547cad5fb, + 0x461c9b3987cef469, + 0xe837645cb8e324d5, + 0x1fc9348ed7e86453, + 0x28435cdfe3d852af, + 0xe9d6178434eb712d, + 0x497fdac431cd6f79, + 0x2681c5b54fb19de5, + 0x83d1c9587ec4bd63, + 0x93c47a276895cabf, + 0xbd2ae56a97b8ea3d, + 0x549cea7ed5bcf8a9, + 0x4a89367fe6cf2a17, + 0xac78942217d24983, + 0x7eba418323b546df, + 0x281d9e7542c9765d, + 0x1f857c9761db74c9, + 0xd9c41fe98fbea437, + 0xd8e2a4fa9eb1c2a3, + 0x6df4753fecb6d321, + 0xb328a7cfe895cf6d, + 0xf7ed23821687fed9, + 0xe4269da438ac1e47, + 0xd89c2fe6569f2db3, + 0x27fac4ba97b46c31, + 0x264f7eba92b45a8d, + 0xbfda145dc1b768f9, + 0xaef6812edf8ca967, + 0xd2b967c1fc8ea7d3, + 0x46cb7ef43ea2d751, + 0xe518b4c32b83e4ad, + 0xc98716b65a97f42b, + 0x4e7dc5f768ab1397, + 0x4c8e351ba79c42f3, + 0x5adf197dc6af5271, + 0xf791653dc3825fbd, + 0xcbe91321f1957e3b, + 0xefba386321968da7, + 0x184e2dc43f7bac15, + 0xdb7e3ca54d6ecb81, + 0xe9dfc7665a61c8ed, + 0xc457e38a9a73f85b, + 0x3694af1eda9618c7, + 0x54a16c3fe79b2835, + 0xad328b71f58d46a1, + 0xd34761c3248e651f, + 0xac2de1465492837b, + 0x7485fc17618592e7, + 0x357ace198f79b165, + 0xdefb43687d59afb1, + 0xa62f9e19895cbd2f, + 0x3a17ef9dc951fd8b, + 0x1c8f952fe9641cf7, + 0xf6ac4d921a682c75, + 0xbf7ac46437694ad1, + 0xc86edf98736c594f, + 0xbfd23ce9824f57ab, + 0xd3ba589dc163a729, + 0x23d5a7edcf34b695, + 0x51789b3dcd48b5f1, + 0x2a897f4feb4ac36f, + 0x3fe52782194ce2db, + 0x847251976c731249, + 0xab4637d98a7631b5, + 0xbc138dfba9685f13, + 0x1f47c82ba5394d7f, + 0x81a32d6a923a5ceb, + 0x96c258eed13f7c59, + 0xdb74c13fef329ac5, + 0x57fea3921f26ca43, + 0xc25879e43d26c79f, + 0x42cfed865b3ae71d, + 0x41295cf76a2df579, + 0xefa2869cba4126e5, + 0xf2a89c5eda274563, + 0xa8e3b24ed62753bf, + 0x2c97de81f54a723d, + 0x5deb8f63243d71a9, + 0x8a32de75412d8ef5, + 0x59b8a4e76f12be73, + 0xda8f42576d14abcf, + 0xefd167998a17eb4d, + 0x7b983a2dc718fab9, + 0x9b627e4ed93e1b27, + 0x482b5d61f8214a93, + 0x48651b93281347ef, + 0x7afd68943418576d, + 0xe21fc9b7631a75d9, + 0x385e7baa921da547, + 0x34ce8a187dfea4b3, + 0x78945fbbacf2d431, + 0x419ecf2cbaf4e18d, + 0x65c7f29cb7c5dfe9, + 0x17d59c3329ea1f57, + 0x729c6e5547fb2ec3, + 0x9f4be8a767ef5d41, + 0xec942b6874f25b9d, + 0x86352a4a93f57a1b, + 0x59bf61adc1f69a87, + 0x4ed3c8fa9fdba8e3, + 0x58d21c91fbdec861, + 0x5fab73c32ac1e5bd, + 0x6cde84b32ad4f53b, + 0x796b3e465be814a7, + 0x37cfb45989eb3415, + 0x5138cd7ba7ed5381, + 0x54db276a94bf51ed, + 0x84971fedc3d27f4b, + 0x89d46731f1d48eb7, + 0xaf91672431e8ad25, + 0x1f8769a43fdabc91, + 0xd269fe143a8cb9fd, + 0x386eb4265ac1f96b, + 0xf69ce1b98ac419d7, + 0x4b69dfadcad82945, + 0x6fc73b8fe6da47b1, + 0x57d1ca6fe4bc562f, + 0xf93b548213cf648b, + 0xa6f3291654c293f7, + 0x2561f4c981d6b275, + 0xc4fe5ad76fa8b2d1, + 0x8ab1f3276c89be3f, + 0xa8fc3d27687cde9b, + 0xc28ef6bedab32e19, + 0x15479ea1f9b42d85, + 0x891357a328a74be1, + 0xb7d15f3326b94a5f, + 0x89e5f375439d58cb, + 0x23a41f7762bf7839, + 0x4a72d53a91c2b7a5, + 0xe925df8cbfa6c713, + 0x76eca94cbd98c47f, + 0xe8d1c621fa79d3eb, + 0x8e7c4f621b8df259, + 0x3b5f28e76ba132c5, + 0x2b6931e98ab76143, + 0x5134d28875964e8f, + 0xd6afe71a93785dfb, + 0x85cd316cb28c7d69, + 0xfda1b2edc17f8bd5, + 0x4bca5d1fef82cb53, + 0x2f5476821e64c8af, + 0xdc7846a43c67e82d, + 0xc2ab15743c5bf689, + 0x92d14ac76a8d17f5, + 0xfd15be9dcba14673, + 0x7a129e8cb78354cf, + 0xda67813fe598734d, + 0x2743da51f36a72b9, + 0x678eb2c4348da127, + 0xda9587e5416eaf83, + 0xc16a52f54e52acdf, + 0xd59e8ca87b64ec5d, + 0x54c638d87a46fbc9, + 0xc5314f9eda6b1c37, + 0xfb59637ed86e2ba3, + 0x7d42cb31f9836a21, + 0x736bcea21963587d, + 0xdb856393234576e9, + 0xc2a975e9824ba657, + 0xa261f979816da5c3, + 0x1c35f24a9e6fc541, + 0x2743f56bac53e29d, + 0x1af3c46edc56f21b, + 0xa6c59711fc5a2187, + 0xce73a4f2195a2fd3, + 0x16a9fed4396d4e51, + 0xe7b8a5f767415cad, + 0x34bc87ea96547c2b, + 0x7a4ed32dc2358b97, + 0xa6b59d2dc148a9f3, + 0xa9516e3cbf3dc971, + 0xc84fa37fea2fb6cd, + 0xe735f6a21d32f64b, + 0x792eab554d3615b7, + 0x6249dfc98c4a3625, + 0xbde971498a3c5491, + 0x5bd3f46a973c52fd, + 0x3f629b5ed742816b, + 0x5872b4fed4238fc7, + 0xb476a951f127ae35, + 0xd5f7ca654238bda1, + 0x2b3ec7654e2acb1f, + 0x68153f754c1fea7b, + 0xbc74f3998c231ae7, + 0xe8c514fcbc172a65, + 0xf7c48beeda2948c1, + 0x2b5438aed81b573f, + 0x4ce87921f41e659b, + 0x5ae82cf54732a519, + 0xd23a6fb87614b385, + 0x3b14e5998427b3e1, + 0x1d73bac76de8c15f, + 0x82ec6af659e8dfab, + 0xe2a6835878dcfe29, + 0x275d46edcaf12e95, + 0x396cfaeed8e54cf1, + 0x7f6cad5218e74b6f, + 0xdea9f51324f859db, + 0xc8bf437653fd7a49, + 0xc312af7762ef98b5, + 0x932def5ba1f4c823, + 0x4fe57a8a9ed4c58f, + 0xc57ad4ea9ac7d4fb, + 0x856f971feadbf369, + 0x1c5984732ace13d5, + 0xfa1ec5387be16253, + 0x4783ed2768d451af, + 0xf3dcea4985c76f1d, + 0x6d195eb983da6e79, + 0x684d71ea92db8ce5, + 0x42d7f63cb1dfac63, + 0xc98e367edea2c9bf, + 0xdea2c5721fb5e93d, + 0x5f4867d32dc6f7a9, + 0x721ac3d65bdc2917, + 0x95ec3bf76ace2783, + 0xa8d23c7a98b145df, + 0xf5ad324cb8c3745d, + 0xb74c1dffe4d673c9, + 0xd25ea141f4dba237, + 0xc4d8763324cdb1a3, + 0x51abc284318c9def, + 0x8cb6e7a54f92ce6d, + 0x92bde3665b84fcd9, + 0xcdef5ab98cb91d47, + 0x84bf361ed89a2cb3, + 0x3af2bc6ed8ae5b31, + 0xbc763411f6b1598d, + 0x7f852bc215b367f9, + 0x49cfb61323c5a867, + 0xfe489cd652b9a6d3, + 0xbde7c91982adc651, + 0xfc89ad276e7fc3ad, + 0x96f3ebdbad94f32b, + 0xc9846abfedb61297, + 0xa523871feba941f3, + 0x4639f5132a9b4f61, + 0xfae8bd33267c4ebd, + 0xe96b7d1656917d3b, + 0xd54e9ab764938ca7, + 0x5df328adc397ab15, + 0x2c9afe4ed279ca81, + 0xa6c3bf2a9f5ab7ed, + 0x72b36a4edc6fe75b, + 0xe43671d32e9316c7, + 0x83d952a54da82735, + 0x49b8d2f76c8945a1, + 0x62b5aed8798b641f, + 0x9c1d23fba58e627b, + 0xfead64bdc58291e7, + 0xb2c4871ed283af45, + 0x63197cb1f276aeb1, + 0x5bc4af243168bc2f, + 0xb9a843132f4aec8b, + 0x4a6f5d943b4deaf7, + 0xfd653b7a9d832b75, + 0x17e2fc6bab7649d1, + 0x64a2f71dca69584f, + 0x8d57b29fe74c56ab, + 0x8e1a2541f45e8629, + 0x5f7e6c132671b495, + 0x78cb39276375b4f1, + 0x7dbce3498157c26f, + 0x5e8d2c776f48e1db, + 0x6d342ca87c4bef39, + 0x715efbda9b4e1fa5, + 0xb2856ecedb745e13, + 0x9ba6cdffe9354c7f, + 0x623fc9e218375aeb, + 0x8c3416b3263c7b59, + 0x87da4517643e89c5, + 0x3e186c7ba561c943, + 0x8fcdb17ba143c69f, + 0x49fbe38baf37e61d, + 0x2537e48dcd2af479, + 0x628d7451fb3c14e5, + 0x684daf221c5f2463, + 0xd5f4b8376a4352bf, + 0x3dba12998a46713d, + 0x9eb43cfba5276f89, + 0xf715246a942a8df5, + 0xfd786a4cb42ead73, + 0x3fce496ed231bacf, + 0x13e4895dcf13ea4d, + 0xe96fc4332e15f8b9, + 0xf87ea9b65e3b1a27, + 0xd7f1c4976c1d2893, + 0x8a946dc8791d36ef, + 0x26f8e54cba12756d, + 0x6d12958dc81574d9, + 0xa5c1b7dfe619a347, + 0x971d4b21f51ca2b3, + 0xdfa89366564ec231, + 0x47cbaf165321cf7d, + 0x8b7ae1d54bc2fde9, + 0x24edfc798cf61e57, + 0x2ed6a9b87af82dc3, + 0x7863f51ba9fb5c41, + 0x91ad283cb6fe4a9d, + 0x7569bf1fe6f2791b, + 0xd6e3482215f3a987, + 0xbe65371324f6a7e3, + 0x4b6fa17653fac761, + 0xbd3c47a761fac4bd, + 0xc5231b987dcfe43b, + 0xd2a4e1fcbde413a7, + 0x823ba69edce84315, + 0x19782ba1fbea5281, + 0xd96bfa8217b94fcd, + 0x34675df327cd6e4b, + 0xcb6a259545e18db7, + 0x3b1ad6e986e4ac25, + 0xc36db79983e6cb91, + 0x71c52a4a91c7b8fd, + 0xb86ac35a9face86b, + 0x7a6298fdcbaef6d7, + 0x84976a321ed32845, + 0x4d8cf5943cd746b1, + 0xb86953a54ac9652f, + 0x7cbe8a1657dc638b, + 0xb658c32a95bd82f7, + 0x267bedadc6d2b175, + 0xf67241eed3b4afc1, + 0xa1d5c94fe1a6bd3f, + 0x179fa3c321a7ed9b, + 0x81e2b9543e8bfc19, + 0xc9f5bd854daf1c85, + 0x4b3ef8c87cb34ae1, + 0xd3c69a298ab6495f, + 0x846c1abed6a857cb, + 0xc9b6a5dfe5bc8739, + 0xe86751a1f3be96a5, + 0xca81b53547b2c613, + 0xebd1437652a4c37f, + 0x71ad98665196d2eb, + 0x52137d976e8af159, + 0x17ae49698e9d21c5, + 0xfd614b2bab9e4f23, + 0xa18563fdca924d8f, + 0xa1975d2fe7845cfb, + 0x73be2f6215a87c69, + 0x3146e5d3247b8ad5, + 0xaf1b7297648eba53, + 0x43bafde76381c7af, + 0x51c2d43ba194e72d, + 0x54218fccbe76f589, + 0x6eb1879dcd8a16f5, + 0xc8a5d361fc9d2573, + 0x45ab7c921a7e43cf, + 0x16d4b8f65b93724d, + 0x68efd5b54a8571b9, + 0x4e9b8d5ba5689f17, + 0x673b4fca946bae83, + 0x4c3f92a9825c9bdf, + 0x71b25d9dc271eb5d, + 0x8e4a5c2ede53fac9, + 0xab7631932f681b37, + 0xd76fba854e6b29a3, + 0xf3b74a976c7d5921, + 0xefbd17c98a5f467d, + 0x2618d35cba6275e9, + 0xf4e5128ed986a457, + 0x2dca51bfe568a4c3, + 0xb4ed83c1f57bc341, + 0x69ca3b43235ec19d, + 0xcdab38e54251def9, + 0x9a2be6198e541f67, + 0x63f2ce798c572ed3, + 0x61eda23a9c6a4d51, + 0xe736a84a983c4bad, + 0x69e52b4ed84f6a2b, + 0x2a8c9eb1f6428a97, + 0xb3ae87921745a8f3, + 0xb27c6e943549c871, + 0x831b5cd76239b5cd, + 0x495cb139813de54b, + 0xc971b2fbaf5214b7, + 0x254bd17dce673425, + 0xf15a926fed485391, + 0xdf12ab3fea3951fd, + 0xdbf3ac42192c6f5b, + 0x6718cd24382f6ec7, + 0x1ca265387842ad35, + 0xfbe239698635bca1, + 0xd571be2a9437ca1f, + 0x4395dafdc12ae97b, + 0xd4bef81bad1cf8e7, + 0x3aec1d71fe312965, + 0x768f4e543e2547c1, + 0xf1d3c5654c18563f, + 0xcf9b17265c1a649b, + 0x38a45f987a2d8419, + 0xa847ef5cb71fa285, + 0xb547d6fdc734b2e1, + 0x265e93bdc315be4f, + 0x7695e381f216deab, + 0xf596ad35431afd29, + 0xc96e48d43efc1d95, + 0x712fc4d65ade3bf1, + 0x21b3a9887be24a6f, + 0xfd49b26879f458db, + 0xa78d436dc6fa7849, + 0xcf5a134ed4fc97b5, + 0x218ac96ed5feb723, + 0x84acd75325e1c48f, + 0xdea34b8652e4d3fb, + 0x2b6dfa1651e7f269, + 0xaf13c4887fea12d5, + 0x6f273c1a9ced4153, + 0xdac9486878bd3e9f, + 0x1c7296acb9c36e1d, + 0x2da13eb1f8e46d79, + 0xcad3b7f216d78be5, + 0xf46d3ea325ecab63, + 0x3fd1b95543cda8bf, + 0x1548fba874c1e83d, + 0xbaf97c5981d3f6a9, + 0x6a12893cbfd92817, + 0x7b39d84dcedb2683, + 0x5c69fb1fe9ab34df, + 0xd9ab56f21abf635d, + 0x31e2f5a54ad372c9, + 0xb8cd27e659d6a137, + 0x4238f9d765c7af93, + 0xacbf58e763a89cef, + 0x647eb9f9829ebc6d, + 0x54abe2ddc2a1fbd9, + 0x1692cbafefb51c47, + 0x926c7fa21fc72ab3, + 0x936b18254ecb5a31, + 0x12ab87e43bac478d, + 0x58a6937548ae56f9, + 0xdfe1428cb9c2a567, + 0x13fad89dc7b6a5d3, + 0x51df2c4fe6b9c451, + 0x3c269ed1f389c2ad, + 0x9426c7d4349de12b, + 0x4c15879764c32197, + 0xc218f4e76d952fe3, + 0x8a54be387da84e61, + 0xbfd987576a784cbd, + 0xc7bd512ba98d6c3b, + 0x6cfba95ed58f6ba7, + 0xe21957c1f793ba15, + 0xb96ad57326a5c981, + 0xa15ef4b32387b6ed, + 0x72d39b15428ae65b, + 0x589347b7618df4c7, + 0x1d8af34cbfa12635, + 0x8a37eb6dce9654a1, + 0x3f4e612edc98631f, + 0xab534c91fc8a617b, + 0x5d4ce972195b6fd7, + 0x63d159e3287f9e45, + 0x8b6fc9365673adb1, + 0xd691eaf98475cb2f, + 0x43ad6e1a9256ea8b, + 0xda576e9cb15ae9f7, + 0x61b58f2dcf6e1a75, + 0x72b49d31fe7248d1, + 0x42dfc6721d83574f, + 0xcab8d3632d4765ab, + 0xf5a692154c6b8529, + 0x38abc5d8786da395, + 0xea8bfd2a976ea3f1, + 0x1dcae58cb573c16f, + 0x859e736ba254dfcb, + 0xec354f6ed157fe39, + 0x4b6af924326b1ea5, + 0x8b9fec365f6e4d13, + 0xc91f8a476d514b7f, + 0x25d1bac87c4359eb, + 0xd564c8acbc367a59, + 0xf15a397ed73a98c5, + 0x82d73fafe75db843, + 0x5c8f214ed43eb59f, + 0xe789fc132763e51d, + 0x95421f876245f379, + 0xd96cb329826913e5, + 0xc65e241a9f5c4263, + 0xf5c364998c3d41bf, + 0xce89352bab416f2d, + 0x9be87f4edb236e89, + 0x1235ba9fe9268cf5, + 0xe6c3a2b21829ac73, + 0x7d45cf94352ba9cf, + 0x8b54ad97652fc94d, + 0x61bfdac98432f7b9, + 0x83f4eb1dc3461927, + 0x7395a14dcf1a2793, + 0xc32f567cbc1a35ef, + 0xdb9c5211fb1e546d, + 0xb167f8c54c2173d9, + 0xf34219876c15a247, + 0xf7d42c576927a1b3, + 0xef64d5b98739bf21, + 0xd41ceb99841abe7d, + 0x795e6d29831fdce9, + 0xbdf9735fe4231d57, + 0x59c87f4edef52bc3, + 0xa74f89332ef85b41, + 0x9487ce532cfa489d, + 0x38fbcd154afd681b, + 0xbda62c854aef9687, + 0xd28bf43a98f2a6e3, + 0xc1a9e26cb8f7c561, + 0x615fe7bba4f7c3bd, + 0x7a6f253ed4fae23b, + 0x9a17e3b323edf1a7, + 0xe2b9154986f34215, + 0x1c4b72876ed54f71, + 0x1dba3ec65ab64ecd, + 0x864d53b87ae96d4b, + 0xadeb716a98ed6cb7, + 0x2df5a4edc7df9b25, + 0x2c1b5631f6e3ca91, + 0x54f876e215c4b7fd, + 0x1f8943e323d8e76b, + 0x26a93eb542caf5d7, + 0x231dc68a92de1745, + 0xb3a758fa9fd245b1, + 0x1483b52badc5642f, + 0x6f7d548fecd7628b, + 0x548263afe9ca81f7, + 0x3c6978d218bc9f65, + 0xb29ade1436af9ec1, + 0xd79bf61656a2bc3f, + 0x5427ca9763a4ec9b, + 0xc3b96f1983c7fb19, + 0x47b8c3eba2dc1b85, + 0xc432fd7cbfad39e1, + 0x54f3b6dfedb1485f, + 0x8df7ca621ea356cb, + 0x756f1d332dc78639, + 0xf9b6281438cb94a5, + 0x5b2acd6878adb513, + 0x6fe3cad9859eb27f, + 0xd531e4bba593d1eb, + 0x51267eadc2a5ef49, + 0x234761cfe2a81fb5, + 0xba2179c651ab4e23, + 0x841acf732e7d3c8f, + 0x7c6faeb54d815afb, + 0xcb1698d65da37b69, + 0x59c3a8e87ba689d5, + 0x1c867a9ed78ab953, + 0x3fb28ceed47cb6af, + 0xb13c752fe48fc62d, + 0x72cb4fd215a2f489, + 0xd7b9af2763a714f5, + 0xd14ef62981ba2473, + 0xe42a3b176e7a42cf, + 0x174d5efa9c8e614d, + 0x1c2fa47cbc716fa9, + 0x7b926c4edb849e17, + 0x13758c41f976ad83, + 0xc8d5964216579adf, + 0xecf968a3246bca5d, + 0xeb2cf975435fe8c9, + 0x9d2c567cb5941a37, + 0xd74a6e1dc19628a3, + 0xae2617bdcf7a5821, + 0xe379b2ddce6b457d, + 0x98ab4371fb5d64e9, + 0x5917fc332d81a357, + 0x3eb752f54b75a2c3, + 0x5f72ce376a78c241, + 0x27e458b76547bf8d, + 0xa83b2648734acdf9, + 0x61e487cba24efd67, + 0x2d9c4f6fe1742cd3, + 0x3d15b89fef674c51, + 0xebac92d21f3749ad, + 0x271e6c843e4c692b, + 0x7218dba54c3e6897, + 0xe4f73b198b51a7f3, + 0x3da846fcba54c671, + 0xe986241ba736b4cd, + 0x4fbca96ed659e34b, + 0x63a854ffe34cf2b7, + 0xfa1927b5467f1325, + 0x6f32c51983745291, + 0xd7345c876c254fed, + 0x1825dc687d286e5b, + 0x73e51b298b2a6dc7, + 0xf635cd1cba2e9c35, + 0x968acd7fe842cba1, + 0xc346fdbfe734c91f, + 0x48d9b7621625e87b, + 0x29cd7b843429f6e7, + 0xd2fa716a943d1865, + 0x32c48aea924f36c1, + 0x4ef5cdbbae12653f, + 0xa143f56dce15639b, + 0x8c1f9dbfed2a8319, + 0xd5496211fb2ca185, + 0x985b1644382c9fd1, + 0xe3694a765821bd4f, + 0xb9ac61e65613edab, + 0xac2671b98516fc29, + 0x7ef49d3cb42a1c95, + 0xd8459c2cb42c3af1, + 0xd2bc3e9baced396f, + 0x3c542dffecf157db, + 0x95c8e4b21df38749, + 0xf938c6b32cf796b5, + 0xa9c4837659fab623, + 0xb641ec8656ecb38f, + 0x284ba36875dec2fb, + 0xd2ca657cb5e3f169, + 0x8b1a467dc4f721d5, + 0x42cfb6aed1e92f43, + 0xb176489321ea3d9f, + 0x485b21743fbe5c1d, + 0x5e68bdc54de16c79, + 0xa2be7c976bd38ae5, + 0xfda1637989e7ba63, + 0x5f3c74ea95d8a7bf, + 0x1e248fcba5ebc73d, + 0x9275cebed3cfe5a9, + 0x794ba85438e42617, + 0xd52b917764e72583, + 0xe81c92b761c843df, + 0xb8c26f387fcb625d, + 0x42ced3987dbe61c9, + 0x46371debabc19f27, + 0x4b82c39ed8c4ae93, + 0xa25ec63ed6a59bef, + 0x68cb37e215a8cb6d, + 0xadfe7c13248bead9, + 0x13fedca653befa47, + 0x425c1fa985d429b3, + 0xce4f968cb2d75931, + 0x8fe9245bafb9468d, + 0xd6b9718dcdab65f9, + 0xb8ae49c1fcbe9467, + 0xf6ae31532cb1a4d3, + 0x7c2af6e54ab6c351, + 0x1ebf6c854796c1ad, + 0x951e8b776598df1b, + 0x7bafd357639bfe87, + 0x84e657cba49f1de3, + 0x4d91f6afe2b34d61, + 0xa138725fef854abd, + 0x7e5cb4221f986a3b, + 0x87abd3132e8c69a7, + 0xdcfe53754c8ea915, + 0x1d47ef976ba2c781, + 0xcb2f4ada9783b5ed, + 0x1aeb37fdc697e45b, + 0x85e2614ed489f3c7, + 0xc794d251f6ad1435, + 0xd93ae583259f43a1, + 0xa9d263b873a4621f, + 0xcb26e4a43e845f6b, + 0xa31fbe554c586ed7, + 0xb9d214798c7b9d45, + 0xeb9d765ba86e9cb1, + 0x734be96ed871ca2f, + 0x6cb497d1f563e98b, + 0x2d4a35921465e8f7, + 0xd76efa54348b1975, + 0xb1283c97648c37d1, + 0xbf3a15ea918e364f, + 0xf813d62a9f7264ab, + 0xb2f6a84dce768429, + 0x27cfd39fed68a295, + 0x235179ffe96ba2f1, + 0x5cf947e2184cae5f, + 0xe8a47c543751decb, + 0x7a128ed65764fd39, + 0x8ec61f4a94671da5, + 0x6951d7acb57a4c13, + 0x946fd3ccb15c3a7f, + 0xc65e4bdbad3f48eb, + 0x149a62b1fe427859, + 0xcb9e7af21e3497c5, + 0x3759a1f32d59b743, + 0x2db9e3c6583ab49f, + 0xc93a62f8785ec41d, + 0xcfd9248cb851f279, + 0xd7bf8a1dc87612e5, + 0x1a56cdffe5794163, + 0x9e6834fed1483eaf, + 0xa4896e74314b5e2d, + 0x7f6d14843e2f5d89, + 0xcf2793876d328bf5, + 0x6db531998d25ab73, + 0x685b4f387926a8cf, + 0x5971ca4cb72ac84d, + 0xdbe7a93dc52de6b9, + 0xca3b4861f9531827, + 0x829cd5b218452693, + 0xae4cd317652734ef, + 0x56ecf7b9812a536d, + 0xa1264bd87f1c62d9, + 0x368efb5bad2f9147, + 0x458daf2cbc129fa3, + 0x4378cb2eda36be21, + 0x2b8e9751f816bc7d, + 0xd7c3b4832618dbe9, + 0x5d19f684361dfb57, + 0xa31b9fe987412ac3, + 0xa7648c1cb7265a41, + 0xf5872d1cb216479d, + 0x53978cdbaef9671b, + 0x62a1e73cbdfc9587, + 0x4a5d8e9dcafd95e3, + 0xf9d172a43bf2c461, + 0x81da7bc438f4c2bd, + 0x18b27d4658f7e13b, + 0xdfa1b36654d8ef97, + 0xb51c974985db1ef3, + 0x3b529fcba4df3e71, + 0x1dec589ba1f24bcd, + 0xce1f6b2edfe56c4b, + 0x5a3def221fe86ab7, + 0xe47d8f243dec9a25, + 0x5c6db2954adeb891, + 0x21ae3b6658c1b6fd, + 0x1dc8e36a98d3e56b, + 0x3472d91ba5c6f4d7, + 0x2c86b59ed7eb1645, + 0xdc397e51f5ed34b1, + 0xd369ae7214ce532f, + 0x4af6edc652e3618b, + 0x51fed2c43db46fe7, + 0x139d8fe54dc89e65, + 0xbeda928768ba9dc1, + 0x64b5ca99879dab3f, + 0xaf26153ed6c1ea9b, + 0x5d468acfe6c4fa19, + 0x8ef491a326d71a85, + 0xf87c25b545ca38e1, + 0xa24b9c8762bc375f, + 0x1b95463871af45cb, + 0x8924f73bafc28539, + 0x8e23a54cbec693a5, + 0x75fa3d4fedc9b413, + 0x564387afe89ab17f, + 0xab286472167cafdb, + 0x1d5a869437a1fe49, + 0xe3cda89767a41eb5, + 0xac24318a96b84d23, + 0xad492e5872a93b8f, + 0x2e8c435ba18c49fb, + 0x4a7698fdce8f5a69, + 0x49b62a31fea298d5, + 0xa29fbe821ea6b853, + 0xeab5c6d32c87b5af, + 0xf3d98eb5498ac52d, + 0x623abc96567de389, + 0x3df15a7cb8a213f5, + 0x1c95384ed8b64273, + 0x76e982bed39741cf, + 0x9537b8dfe1895f3d, + 0xc98d3743217c5ea9, + 0xbae5d2c43e6f8d17, + 0x4a69df265e72ac83, + 0xe7fa49865b64a9df, + 0x2c754b398a67c95d, + 0xce97264cb65ae7c9, + 0x72d4af1dc56df837, + 0xd324b791f69127a3, + 0xb17dfc5438a65721, + 0xb18c95743298547d, + 0x4a1f3276517a63e9, + 0xed76fc398f6d9257, + 0xb9ed61f98d6f91c3, + 0xbc981d3bac74bf31, + 0x4bf571edc954be8d, + 0x925af76fe746dcf9, + 0xd73865c2184afc67, + 0xf2e871b5476e1bd3, + 0x724c31ea97824b51, + 0xbf3cd5ea926348ad, + 0x379d468dc157682b, + 0xd2859b4dcf3b8697, + 0x81a5692cbd4c96f3, + 0x126b597fec4fb571, + 0xba429e821a52b3cd, + 0x8adcef443a56e24b, + 0xbd724ec65948f1b7, + 0x8dc21e4ba97c3125, + 0xef6b91dba65d3f81, + 0x5c8d632ba3514ced, + 0x6dba895fe1436d5b, + 0x85c7a94fef256bc7, + 0xda59c4f21f2a9b35, + 0x61795f254e3db9a1, + 0x8d364c965a3eb81f, + 0xd65713b98a32e67b, + 0x634bd1cba924f5e7, + 0xf3e8129ed93a1765, + 0x598ac67fe74b35c1, + 0xf21dcb8fe62d543f, + 0x5adcb1843541629b, + 0x83a54d9873458219, + 0x51b6c7e54e169f75, + 0x473f1a976c289ed1, + 0x5861e2d8791bac4f, + 0xfe3b5619871fdcab, + 0xbc32481ed813fb29, + 0x968e27c1f8261b95, + 0xd5bafc65472839f1, + 0x1bdfa565451b386f, + 0x86dcfab8731e46db, + 0xc6175d3cb3218649, + 0x2d764f198ef294b5, + 0x948b1d3badf7b523, + 0x71a3568dcae7b28f, + 0x97b26e8ed7e9c1fb, + 0x62ec3d5217ecdf59, + 0x8fdb67e548e21fc5, + 0x532f8cb878f62e43, + 0xbea28dc874e63c9f, + 0xb75f36c983f95b1d, + 0x2e31f96ba1fd5b79, + 0x6f7bd13badcf79e5, + 0xba32e671fde2b963, + 0xa8294ed21cd4a6bf, + 0xe539a6d32ae8c63d, + 0x8fceb67437dbe4a9, + 0xbc21f4d768cdf417, + 0x14fce89cb9e12483, + 0x5ecd391ba6c542df, + 0x3f8e2a4dc3e8615d, + 0x651b279fe1d85fb9, + 0xda18e6b431dc8e27, + 0x956d4fb32ebf8d93, + 0xd15b62c54cb29aef, + 0xb92da3f659b4ca6d, + 0xce692f8657b6e8d9, + 0xe174569ba6cbf947, + 0x1bc2a96ed6ce18b3, + 0x36cd2141f7d25831, + 0xdae5479216c3458d, + 0x1dcb9e5432c764f9, + 0x9a7b2c6651db9367, + 0x25473f976fac92d3, + 0xb49571f98dafb251, + 0x9ec13bf87a82bf9d, + 0x6492371dc895de1b, + 0x53c2ab1fe5a6fd87, + 0xa6b45193279a1ce3, + 0x67a5e3f547ae3c61, + 0xabd819c765a149bd, + 0x51da762982c4693b, + 0x4d1fe9acb1c568a7, + 0xbfa8372dcf9ba815, + 0xe3d7f81dce9db681, + 0x1eb5692dc97fa4ed, + 0x7523ac421c92e35b, + 0x92a54e843a95f2c7, + 0x9ca2813879ba1235, + 0xe2915ab9879c42a1, + 0x3bc9ae69847b3efd, + 0xe62d75fdc3915e6b, + 0xb6489affe1936cd7, + 0xb643571fef879c45, + 0x68c719d32f689ab1, + 0x598de7643d6cb92f, + 0x5c4791243a5fd78b, + 0xe8c7b9165a82e6f7, + 0x2394ef8dcba61875, + 0x28fe547dc78936d1, + 0xe739b5ced68b354f, + 0x26349de1f27e53ab, + 0xcf72581545a18329, + 0x59e8d2c76284a195, + 0x875d9b354d569fe1, + 0x34fb5ea76c48ad5f, + 0x34f795b76849adcb, + 0x5f3cb48ba85fec39, + 0x2b37c4ffe9731ca5, + 0xe863bda1f9874b13, + 0x3bc9ed421658397f, + 0xf19de573235a47eb, + 0x4ba2fc19824e6759, + 0xc27d8e4ba27196c5, + 0x65329cfbaf75b643, + 0x51b3f6cbad46b39f, + 0x68dc714feb59c31d, + 0x489d6271fa4ce179, + 0xac8dfb72183cefd5, + 0x9b87de176a742f53, + 0x3194752767453daf, + 0xcba2157a96485c2d, + 0xe8d3f29ba23b5c89, + 0x86df9c1cb13d7af5, + 0xa71c6b5edf41ba73, + 0x7f5dca1fed23a7cf, + 0x53bf72621e26c74d, + 0xc61afd843c28e5b9, + 0xf3c479176a3cf527, + 0xd4ce6b298a4f1593, + 0x4e8c9b5ba85243ef, + 0x1ed74f5dc837526d, + 0x87c46b1fe43861d9, + 0xb57ad28fe12b8f37, + 0x6975e8d5412d8ea3, + 0x8cbed4f76f43bd21, + 0xa7b39dc65e13cb7d, + 0xbfc7e1a76b15dae9, + 0xed4fc2b98b19fa57, + 0xd7895e1cb82d19c3, + 0x1692538ed82f3941, + 0x37d52ec1f712469d, + 0x4ab157843825761b, + 0xb4961ad6531a9487, + 0x5fbe4c68721b94e3, + 0x482edba87efdb361, + 0xac3bf95769efa1bd, + 0xa5d1492989e3df2b, + 0x2d49f7ecb8d4fe97, + 0xd8f94a5dc7e81df3, + 0xb1e6598328fb3d71, + 0xebd379f325fe3acd, + 0x62c85df875f16a4b, + 0xc9a543e982f369b7, + 0x2c46ea3cb1f7a925, + 0x26ce1bd98feab791, + 0xd34ce76989cba5fd, + 0xc268fb9fe9cfd46b, + 0x5df7ae421ac2f3d7, + 0x93c81da76be81345, + 0xfc8d7b2768e943b1, + 0x1fa9dc4987db512f, + 0xec5f942983cd4f7b, + 0x72b3f4cba3c16de7, + 0xeb8d641dc1e39d65, + 0xfc184d7fefd69bc1, + 0x9b45e3821ec8ba3f, + 0xd7cb43632eacd89b, + 0xc765b8f54abfe819, + 0xe2f451b87bd31985, + 0xc9e1b3dba9c637e1, + 0x52a76c8cb7c9365f, + 0x3a7df96fe3da54cb, + 0x5d3e84b1f2ce7439, + 0x4d7c6eb434d192a5, + 0x86e3952874d6b213, + 0x82f91ea43d95ae6f, + 0x5f9163d54c87aedb, + 0x42fce5d76a8bed49, + 0xfca25e4a978efcb5, + 0x4b36d89fe9b54c23, + 0x26ab815fe6b53a8f, + 0x723bc49215a748fb, + 0xb1edc6a323bc5869, + 0xdfe6372542ae87d5, + 0x41da86ba92c1b753, + 0x9e238cd87e83b4af, + 0x92315f6bae97c42d, + 0x6b41fc8edc7ae289, + 0xf8b39e2ed98be1f5, + 0xceb7da354baf2173, + 0xd32bec6547823ebf, + 0xe2865bf547965e3d, + 0xbd9caf7763875da9, + 0xc349581ba39b8c17, + 0xb418e92dc17e9b83, + 0x7fa614ecbe61a8df, + 0x851bde91fe73c85d, + 0xd325ce421d75e6c9, + 0x4dab61932c8af637, + 0x3f6128965b8d16a3, + 0x29dba7398a9f4621, + 0x1c642d8cb892537d, + 0xfe192b8dc48562e9, + 0x1fb4539fe38a9157, + 0xd2596c8fe16a8fb3, + 0xe675dc15427dae31, + 0x25ef1cb43f51bc8d, + 0x5ca871654c53dbf9, + 0x3d7bc9698c45fb67, + 0xacb134598b691ad3, + 0x5e16f93dc97d3a51, + 0x42a6b3ddc65f37ad, + 0x24dcab51f583672b, + 0x4be9a6f213648597, + 0x7fcd1965426895f3, + 0x3a4d9f79826cb471, + 0x739d5e276f4ea2cd, + 0x1fe674aa9d62e14b, + 0xb86321fa9b43efa7, + 0x21fe3a6edb682f15, + 0xe5142931f95a3e81, + 0xc86534a2174a3bed, + 0x4ec31df3273f4c5b, + 0x23ae7b9985426ac7, + 0x17ef249cb2469a35, + 0x3674f8edc247b8a1, + 0x17e2f53a9e3ab71f, + 0x753f6d2bac2ed57b, + 0x8ce49b7edb31f4e7, + 0xf819b7e32d371465, + 0xa2e195376b5834c1, + 0xc3489f18794a523f, + 0x2a5ce499873d519b, + 0x6d73b2fa942d5ef7, + 0x49316a5dc4329e75, + 0xfdb8176fe2359cd1, + 0x1a63fc5ede17ab4f, + 0xbd9851a32f18d9ab, + 0xd15f8ab54c1dea29, + 0xa4f125687d321a95, + 0x52b67a8a9b2538f1, + 0xe492568cba18376f, + 0x1762fbddc71945db, + 0x3198ca6fe61d7549, + 0x14637abfe41f83b5, + 0x41a5e3776715b423, + 0x7152bc976325b18f, + 0xe7abc6843cd5afeb, + 0x2c6a87d54bf8de59, + 0x42d835a768eafdc5, + 0xf4295d1ba9ef1d43, + 0xeb49163dc7e23b9f, + 0x1a57328fe7f65a1d, + 0xe58639f214f85a79, + 0xd1e3c7f323fb78e5, + 0xef196a2652fea863, + 0x5d1eac6872e1a5bf, + 0x2fe745198fe4c53d, + 0xfc6219598cd6e3a9, + 0x8f9ab56dcbdaf317, + 0xe57b9461faed1283, + 0xda1764f328be31df, + 0x7416a8b438c25f4d, + 0xd4eba62436d45eb9, + 0x17a8eb2764e98d27, + 0x35b9cf6872eb8c93, + 0xb23865c871bc89ef, + 0x7d2bc96bafb1c96d, + 0x43918cb1fcb3e7d9, + 0x2bc5d9f21dc6f847, + 0x63195cb54cda17b3, + 0x153ef7476acd4731, + 0x235e1bd767bf348d, + 0x6547f83ba7c263f9, + 0x2847f91dc4d59267, + 0xc251a73fe4c891d3, + 0x769f3d4fe2cbaf41, + 0x6b9fdc43218cae9d, + 0x7d1a28354f92ed1b, + 0xc1d26eb54da3fc87, + 0xd3fe45776ca71be3, + 0x6facd97989ca3b61, + 0x37b51d8ba69c38bd, + 0x61389ebed6af583b, + 0xb32c9571f4c286a7, + 0x8f56b43324c6a715, + 0x5ba8ecf543c9b581, + 0xfe4871d65189a3ed, + 0x2fa159e76f8ed25b, + 0x6db394198d92f1c7, + 0xfe8a975dcdb72135, + 0x4925b1aedba73f91, + 0xb9358c7fe6783cfd, + 0x84a5f7b2178c4d6b, + 0x483c5a73248f5bd7, + 0x9b3e4d6876a29b45, + 0xc485bf987385a9b1, + 0xc34b519ba197b82f, + 0xdac682ea9f5ad68b, + 0x9b45fdcbab6cd5f7, + 0x1e8965d1fda21675, + 0x8c7d14b32c9635d1, + 0x8dfe1a332b98534f, + 0xcadb52f5487952ab, + 0x6b793c2ba68d7129, + 0xfbc2d39ba36e7f85, + 0xce4f831cb4739de1, + 0xe91cb67ed174ac5f, + 0x496d821fef46dacb, + 0x356b97421f5aeb39, + 0xeba5dc832c4df9a5, + 0xd38cf5287d824a13, + 0x3ef4cb8a9b64387f, + 0x6123b47ba95746eb, + 0xef4781ced84b7659, + 0xd3b4815fe36d84c5, + 0xfd3a815fe27fa543, + 0x9e38db721463b29f, + 0xcb6417f65376c21d, + 0x7a21cde54e37df69, + 0xd57932e76b39fed5, + 0xda87632a9b6d1e53, + 0x32ad795cb9513caf, + 0x3b85df4fe9645b2d, + 0x463c1a51f7365b89, + 0xe6b48272163a79f5, + 0x4b16ce93254da973, + 0x3681ca26523e96cf, + 0xc1b7f23a9152c64d, + 0x7c2b1fa98f25e4b9, + 0xa5e78f9cbd39f427, + 0xc7fd43bfed5c1493, + 0x4a128c9ed94c32ef, + 0xfd89b6e43b42516d, + 0xd172be5548235fc9, + 0xafb13d2659268e37, + 0x5e61b29875298da3, + 0x351a4f8a954dac21, + 0xe153c67a912fba7d, + 0x7f8465ccbf12d8e9, + 0xfd81456fed14f957, + 0x927ca1e54e2918c3, + 0x9834ad176d2c3841, + 0xac9e42b76a1e359d, + 0xd1e4f5ca9a32751b, + 0xf8916a7dca149387, + 0x4ea2d8bdc61792e3, + 0xfc8769afe53ab261, + 0x251f49cfe21b9fad, + 0xd286b7c5431fce2b, + 0x1a287e443ce1fd97, + 0x1c7948376be51cf3, + 0x351e7f976bf83c71, + 0x9d5b4a1767f839cd, + 0xf4379b5ba7fd594b, + 0xb7984f1dc4ef58b7, + 0x4312fa6fe6f3a825, + 0xa81bd46324f5b691, + 0xc4f9a52432e7a4fd, + 0x79e8fc1651fad36b, + 0x4acfd6b65fbce2d7, + 0x326fe5dbade31245, + 0x52bfc71bace642b1, + 0xa796e4dcb9c74e1f, + 0x4765ab11f6d94e7b, + 0x945fa6c216db5ce7, + 0x78e91f4324df8c65, + 0x84eb2f3765e39ac1, + 0xe5c9a36872d5b93f, + 0x39bc2ea981e6d79b, + 0x5496fea98fcbe719, + 0x4b6edfcbacbdf685, + 0xc7916231fbc236e1, + 0xc796da221bc6345f, + 0xe9568d7329d753cb, + 0x1e93cf4658db7239, + 0x35cbf6e876cd81a5, + 0xe2f456c874ad8ef1, + 0x847f62ba93b2ad6f, + 0x8d9f1c6fe194acdb, + 0xa541327edfa7ec49, + 0xedbf86421e89fab5, + 0x38964e165dae1b23, + 0x83da2f465cb1398f, + 0xeb19d52769a347fb, + 0xe81f924cbac85769, + 0x5427f1edc4ba86d5, + 0x8df61acfe4bda653, + 0x219b3e5ed28e93af, + 0xd36c8fb215a4c32d, + 0xd631eb9542b5e189, + 0xb41c6d743c87dfe5, + 0xcb436e187d9b1f63, + 0x23fa8be7697c2dbf, + 0x7e56a43cba915c3d, + 0x95d837ffe7835ca9, + 0x4d638191f5a68b17, + 0x3527ed42157b9a83, + 0xe6bf43a3236b97df, + 0xb2ed5175428fb75d, + 0x96e4ab387182e5c9, + 0x48f3d75bae96f537, + 0x1b7fe82dce8915a3, + 0x543d78bfed9c4521, + 0x32b56cd1fa8e427d, + 0xd16fe2443b8261e9, + 0x48c65fa32a938f47, + 0xf82cb7d545768eb3, + 0xfb7a16598579ad31, + 0x143e5ac8725cab8d, + 0x7db49539815ecaf9, + 0xa216e73dce52fa67, + 0x78ade141fe7619d3, + 0x8cd94bf32e7a3951, + 0xf8cd3ae32c5b36ad, + 0xae913d554a7e562b, + 0xc8f5be3bab618497, + 0xfe93847cb87594f3, + 0x159ac2eed568b371, + 0xb2fad36fe358a1cd, + 0x49ac2bffe15acf3b, + 0xcaf84db3214fdea7, + 0x52d4a8176f742e15, + 0xea91f8587e563d81, + 0x51ef8a976b473aed, + 0x76d945a9893c4a5b, + 0xa314d78cb83e59c7, + 0xcf14286fe861a935, + 0xe5823461f654b7a1, + 0x97fcdeb32547b61f, + 0x1bedac365239d47b, + 0x5ef9c1b7614bd3e7, + 0xe3a12fd98d3ef265, + 0xcb54728bae6543c1, + 0xa7894edcbc47513f, + 0x64f9e7beda274f8b, + 0x24d371bfe82a5df7, + 0x8e76acf2192e8d75, + 0xc18a7f6657429bd1, + 0x95c2b4f87623ba4f, + 0xf8eb56287325d8ab, + 0xdf436eccb13ae829, + 0x34c9de6bae1cf795, + 0x69a543ecbc3e27f1, + 0xd468a5ffec12356f, + 0x6a41edb32c1654db, + 0xcb49a7365c1a7349, + 0x5e398f17691c82b5, + 0x63a78c4a984ea123, + 0x7651e8ca9521ae7f, + 0xd2673eba9413adeb, + 0x75a2896dc216ed59, + 0xc9417b3bade7fbc5, + 0xdb7f18532efb1c43, + 0xfe59d2b43bed2a9f, + 0xdac9be576bf2591d, + 0xf7d4e1a76bf35879, + 0x1495fb2ba9f687e5, + 0xb762a48dc5fba763, + 0x6e542f8ba3ec94bf, + 0x1fe4527dc2efb43d, + 0xa45978c214f3e2a9, + 0x4789e1f653e6f217, + 0x8a95fcd76fea2183, + 0xbaef69265ab92ecf, + 0x34c289a879bc3e4d, + 0x2dbef36ba8e15db9, + 0x3ef85cbed9e48c27, + 0x4591e861f5e68b93, + 0x728dcae214c798ef, + 0xfac18db323ecb86d, + 0x872feb3542bfc6d9, + 0x62c3dafa91d2f647, + 0x26b471da9fd716b3, + 0x35d94a1cbeda4631, + 0x257c3adfeacb438d, + 0x2584691fe8bd52f9, + 0xcb826fa43bd29167, + 0x7b1c6f4327b48fc3, + 0x27dcb14656c7ae41, + 0x28f4d9c653b7ac9d, + 0xeba581d8739adc1b, + 0x2ab8d14a91afeb87, + 0x5a349dbdcfb41ae3, + 0x86bc7431fec73a61, + 0x59bf32821ea837bd, + 0xe4835fd32dac573b, + 0xcfd1e29439be65a7, + 0xf4752be989c2a615, + 0x671492dba7c5b481, + 0xfe15927cb496a2ed, + 0xc6b58a9fe3a9d15b, + 0xa16d243fe18adfb7, + 0xc72b6ad4319dfe25, + 0x8fb2d3765fa43e91, + 0x1a7e9b354c853bfd, + 0x28a3f6465d984c6b, + 0x849bd5f7698b5ad7, + 0x514bd8adc79e8a45, + 0x61248a5fe692a8b1, + 0x1a2b396fe594b72f, + 0x5da634221396d58b, + 0xcfad45643289d4f7, + 0x2b5f31a7619cf375, + 0x6a9bd1387e8f24d1, + 0x96eb578bad93524f, + 0x1a9d354dcd8651ab, + 0x8ce4f59edb786f19, + 0x67a3c481f96b7e85, + 0x7ea36413276d8ce1, + 0x8ed214643671ab5f, + 0x13c96a865463d9cb, + 0x165c3eb98276ea39, + 0x83a7251cb169f8a5, + 0x9ec2af3cbf7d2913, + 0x136ed87cbc5e267f, + 0xb4a957e1fc7245eb, + 0x6fbae3521d867459, + 0x35cbd1f32b6983c5, + 0x4ebd8f97697ca243, + 0x451da688765da19f, + 0xf9e315c98451aefb, + 0x253a7f6cb253de69, + 0xdc7ef54cb146fcd5, + 0xc8b9a51fef6a1d53, + 0x8c3dbf521e4c2baf, + 0xb7e8f9243c5f4a2d, + 0x137b48d76d425a89, + 0x8765bfaa9b3478f5, + 0x8451fbadcb49a873, + 0x839e4cfcb63a95cf, + 0x97e4b6ddc63eb54d, + 0x62b38c51f451e3b9, + 0x47b69a821465f327, + 0x3c28fb1874681293, + 0x3274bde76d4931ef, + 0x6d195cb87c2b3f5d, + 0xdf1a38c87a2f4ec9, + 0xfe5ba68dcb428d37, + 0xdf45a79fe9258ca3, + 0xda9ce381f748ab21, + 0x43b58f92152ab97d, + 0xf7b24d94342dc7e9, + 0xe81b465a9431f857, + 0xec9d612ba24517c3, + 0xa675324cbf293741, + 0x421d3f5cbe1a349d, + 0xf4b5193fec2d641b, + 0x5768b12feb1f6287, + 0x17adb6265b2491e3, + 0x1df25e854926af51, + 0x5f976e1545169ead, + 0xa39f5c487519cd2b, + 0x576ae129831dec97, + 0xe4197abdc5421bf3, + 0x8b13a25dcef43b71, + 0x46c3f29febf538cd, + 0x26bcaf821df9584b, + 0xd7e59ca32afc56b7, + 0xfedb96254afe9725, + 0xd6f9245878f2b591, + 0xbc59a2f986e4a3fd, + 0x65b1df8ba4f7d26b, + 0x68cf391cb3f9e1d7, + 0x719f8b2dc1dbef35, + 0x8962def543de2fa1, + 0xa34d8be65ec34d1f, + 0x4d8e6a943ce54d7b, + 0x658f72e54ad85be7, + 0xafe83d9879ec8b65, + 0x435fde1ba6de89c1, + 0x1d536e7dc6d1b83f, + 0x4a2e36c1f4e3d69b, + 0xd93fc51324d7e619, + 0xb9cefa4432daf485, + 0xe812ad4873dc25e1, + 0x2b68ac587dbe235f, + 0xd269bac98ed352cb, + 0x38dea49cbcd67139, + 0x8f65a4cedac87f95, + 0x4f753acfe6ba8df1, + 0x8b759e4215ad9c6f, + 0xa5fdcbe43591cadb, + 0x3cb7fa8765c3eb49, + 0xb94a28c872c6f9b5, + 0xc8d5432a94db1a23, + 0x456137ca9eac278f, + 0xf139db5bac9e36fb, + 0x9b128e31fdc27569, + 0xeba6c5221cb684d5, + 0xb49f5dc32bc9a453, + 0x1dc3a295468b92af, + 0xd519bce8769eb12d, + 0x437acb9984a1df79, + 0xdbec619ba293fde5, + 0x18f95ebed2b81e63, + 0x84b796fede782cbf, + 0xeb9a25721f8c4b3d, + 0xd5eb7fa32d7f4ba9, + 0x6d14ac965db38a17, + 0xadf349776cb5a983, + 0xb17f825ba58796df, + 0xb21d6a8dc48ab65d, + 0xa8df293cb37ed4c9, + 0xb31f628fe5a1f437, + 0x9a4b7e6325b614a3, + 0xd59321b873b95421, + 0x3f2467965f8a417d, + 0xabfec6265c6b4fd9, + 0xd813642a9b8f6e47, + 0x3fda7b8dca728db3, + 0x52bafd7fe986ac31, + 0x82abd7e1f456ba8d, + 0xbdf96272145ac8f9, + 0xeaf356b3235de967, + 0xe16db828759218d3, + 0xd47f981cb2a63851, + 0x51dec83a9f6735ad, + 0xb6a8957dce7a652b, + 0xd2fb14cfec5d6397, + 0x918aec7eda6e82f3, + 0x4192d6b43c84b271, + 0x98fb154327549fbd, + 0xd15abc854657ce3b, + 0x73dc28176349eda7, + 0x17e2bc5a936dfc15, + 0xa8e7246ed4723c81, + 0xe3129dacbf5439ed, + 0x8de2b391fe37495b, + 0x62c3a7d21e3a58c7, + 0xb47f96e32c4d9835, + 0xd4a61f265b4f96a1, + 0x453a2f698963b51f, + 0x1f5be94ba845d37b, + 0x15aed73cb548d2e7, + 0x34a9c71ed34bf165, + 0x93ad6451f46e32c1, + 0xf13e942653614e2f, + 0x8fae19b65f234e8b, + 0x8c1f97554d265cf7, + 0xb39c2da76d2a8c75, + 0xf254e9a8793c8ad1, + 0xd8576eccb72ea94f, + 0xb496d3ffe632d7ab, + 0x57aed121f635e729, + 0xd9cf25b21428f695, + 0xc5f428a8754b26f1, + 0x32d576e9813d246f, + 0x64a139b98f2153db, + 0x37d6251cbe157249, + 0xd4f37b8dcd2781b5, + 0x2f34a6bedb2a9f13, + 0x1db4a82fe61b9d7f, + 0x1b46c373261f9ceb, + 0xa235e9d54712ec59, + 0x81bf9da87614fac5, + 0x4ef8531ba6291b43, + 0xceb3692ba31b289f, + 0xac152d6a9efc481d, + 0xc849a5ecbcef4679, + 0xecb8964edbf286e5, + 0xf9c8b6221cf7a563, + 0xde1f593328e793bf, + 0xef8ad39657fab23d, + 0x4e23afd765fed1a9, + 0x4fd6bca984c1def5, + 0xa157436cb4e51f73, + 0xdc625f4ba1e62dcf, + 0xf98672dcbfe93c4d, + 0x2ef6bdc21fed4cb9, + 0xf65d82743cdf6b27, + 0x2fcd6b365ce28a93, + 0x6cfb4e2658c497ef, + 0xaec78b1a95e8b76d, + 0x2eb57d3984eac5d9, + 0x3e8c17fcb3cde547, + 0x53cad1e1f6e215b3, + 0x7b1ecf4326e74531, + 0xc14bf28651e7428d, + 0x1ac6ed854eca51f9, + 0xc87d1e654dbc6f57, + 0x8a29c5f769af7ec3, + 0x1942e7acb9c3ad41, + 0xcd51968fe6c4ab9d, + 0xbc52e7d1f5c7da1b, + 0x675fa8e214cbea87, + 0x4157bcf324acf8e3, + 0x2a7639e985d23961, + 0x2974f31981c436bd, + 0xa257b38a9fc8563b, + 0x5f4dc2aa9ecb64a7, + 0x743c289fecbd9415, + 0xb67d241fe9bfa381, + 0x59361a432893a1ed, + 0xeb3c49d32795cf4b, + 0xf8692ca43496deb7, + 0xfb8ea468749afd25, + 0x4d5cb32984ae2d91, + 0x6a1e2c4cb2913afd, + 0x3289e17edf934a6b, + 0x8dac7231fea659d7, + 0xfb92e6d21eab8945, + 0xce7598443c8d97b1, + 0xcf53b215498ea62f, + 0xb5edf7876792d48b, + 0x18b92efba695d3f7, + 0xb71643fdc4a9f275, + 0xc2d1f34fe59b23d1, + 0x8d53917fe29d314f, + 0xb42981c432814f9b, + 0xbdea48c43f846e19, + 0xea5487b43e967d85, + 0xc7e93a465c698be1, + 0x43c16bf8786c9a5f, + 0x426d7f8a965fa8cb, + 0x4a1965fed672e839, + 0xd5fb278fe384f7a5, + 0xa92ed815469a2813, + 0xed9b31a5438b257f, + 0x93fc45e7617d34eb, + 0x965c7f2baf817359, + 0x824be96bae7482c5, + 0x853efb6dcd78a143, + 0x2f5b84edca479e8f, + 0x9453a1dfe64a9dfb, + 0x2f4ce3d2174fcd69, + 0x9ced2f743762fbd5, + 0x64d27a3a96871c53, + 0x6db91cf9835729af, + 0x86def93ba16b492d, + 0x8176c35cbf3e4789, + 0xf2e935bdcd4187f5, + 0x26b85791fd54a673, + 0x8ba9ec721b3694cf, + 0xd561b8732a59b34d, + 0x941e6236574cd2b9, + 0x4eac168a985fe127, + 0x3f728e6dc8752193, + 0xb379f68ba3452edf, + 0x69458efdc1483e5d, + 0x9f6814afef2a4dc9, + 0x92a6c5321f2e6c37, + 0x4ce2bd765e418ba3, + 0x4ba9dc887d45ba21, + 0x3bf1a2876a25b87d, + 0x3b79c41ba728c6e9, + 0xd3a7268cb82ce657, + 0xe371689cb62ef5c3, + 0x437e5ba1f8753641, + 0x528e76a21526439d, + 0xca3f6bd87249631b, + 0x83bde6765f2c6187, + 0x12d9f8376b1c7fd3, + 0x135aedca9c32ae51, + 0x7c245e6cb8139cad, + 0xcb9fa2dfe816dc2b, + 0xeb7925a1f518eb97, + 0x15bed633261be9f3, + 0x3c4eb696563f2a71, + 0xb35da7e9851237cd, + 0x7b4c583ba216574b, + 0x57af62ba9ef865b7, + 0x9eb3415badfb9625, + 0x3dab589dcbfda491, + 0x9d62e73cb7ce92fd, + 0xdf47c81329f3d16b, + 0xa146d89326e4dfc7, + 0xb86329d546d8fe35, + 0x96afd81875fb2ea1, + 0x91dba7c984ed3c1f, + 0xc58916dba2f14c7b, + 0x123fca9cbfd35ae7, + 0x382e61a1fde78a65, + 0x1c5dbae32dea98c1, + 0x831c57f329dca73f, + 0x2758649437dfc59b, + 0x4c1832a878d3e519, + 0xc182654ba7d6f385, + 0x6d5e1f8cb6d924e1, + 0xa4e9f23dc4db325f, + 0x17e9ad21f2de41cb, + 0xcedf215543d16f29, + 0x456fc3832fc37e95, + 0xa29e8fd54db68cf1, + 0xf719db654ac89b6f, + 0xe7cb3a96568ca9db, + 0x6bef749986bfda49, + 0xc73e25bed6c2f8b5, + 0x7db82411f6d71923, + 0xe9c2457214c9268f, + 0xba7c892542ca35fb, + 0xae3df56871ce5469, + 0x21bade587fb183d5, + 0x621fcaea9ec6a253, + 0xacf59d198cb691af, + 0xda52361dc798af1d, + 0xa26c7511f58bce79, + 0xe7d8a542168fdce5, + 0x6c98e7b658b41d63, + 0x7ad4b5c764952abf, + 0x4831b59872b84a3d, + 0xedc64f8871bc48a9, + 0x2f39d64cbfae6917, + 0x6175cbeedeb1a783, + 0x319f7bdfeb8395df, + 0x5ed4fb721c97b45d, + 0x8c1564b32a78d3c9, + 0x73e9b816589ce237, + 0xa13d4b98768ef1a3, + 0x3a65dfbdc8b65321, + 0x865f372cb2953f6d, + 0x9ad675fdc1874ed9, + 0x859134dfef8b6d47, + 0xd59c32a21f6e7cb3, + 0x483da1765e82ab31, + 0x378caf954c63b98d, + 0x61a3deb54a65c7f9, + 0xc95413fcb95ae867, + 0xef972bcba57bf6d3, + 0x5ab27e1ed69f2751, + 0x45c3d711f58234ad, + 0xd359cb621397642b, + 0x197f6cb5418a6297, + 0x726cf8465e6b81f3, + 0x45ecf9d87c5d9f61, + 0x38db1e587a519ebd, + 0x4831bdfba964cd3b, + 0x8ea415fed845eca7, + 0x4b5ac87fe769fb15, + 0x7e4f1894376d2b81, + 0x8592fdb4345f28ed, + 0xd543e6ca9372485b, + 0xb6e71f8ba18456c7, + 0x5fa782ecbf4a9735, + 0x3f7c5edcbe4c95a1, + 0x58914f7dcb5da41f, + 0xb4ec3251fa51d27b, + 0x3f7cb4832a54d1e7, + 0x9bdafce32937ef45, + 0x1845be3767592fb1, + 0x3d46a2e9865b3d2f, + 0xac3deb1a924f3d8b, + 0x5493d2adc1425bf7, + 0x15f37aeedf248b75, + 0x7e31a651fe3789d1, + 0xb9c56d821d2ba84f, + 0x18924e74392ec6ab, + 0x3c296eb87b41e629, + 0x47213c698a23f495, + 0xfead312cb94825f1, + 0x728a65bdc74a236f, + 0x2dba175fe53c42db, + 0xf89b32cfe23f6149, + 0xb675d13541327fa5, + 0x8ea913b65f269e13, + 0xe62f83d54d169c7f, + 0x76b89e265c189aeb, + 0x15c42ad8781edb59, + 0x1937a28cb821f9c5, + 0x5346a19fe9261a43, + 0x429fb71fe516279f, + 0x6be21cf4362a471d, + 0x81a79357631d4579, + 0x5ea92b39821f74e5, + 0x436b79a98ef1a463, + 0xe9cd41387ce492bf, + 0x28f53eba9af7b13d, + 0xd28fc4acb6e7cf89, + 0xc5a6e37cb6eacdf5, + 0x4e52c86216cefd73, + 0x153e962546e32bcf, + 0xbad16cf875f63b4d, + 0xd7af4ce762f74ab9, + 0x7a2fbc5a91fc6a27, + 0xb47d8efbafde7893, + 0x72f8ec3babc196ef, + 0x92c63b51fae3b56d, + 0x6bae73d21ae6c4d9, + 0xc31e4db329dae347, + 0x47dcb86657dcf2b3, + 0xa5fc42da98df2431, + 0xdb27ce1ba6e3418d, + 0x89c4f3dba2c54fe9, + 0x5fe3d27dc1d96e57, + 0x4cb1862fefba7dc3, + 0x5b79ca132fbe9c41, + 0x7a5926143ec1ba9d, + 0xfad394b65ac4d91b, + 0x61c825d54ac5e987, + 0x96df45c986b9f7e3, + 0x7ac64fdcb7cd2861, + 0xd71e834dc4af25bd, + 0x39c182e1f4d2653b, + 0x2acebf7212d563a7, + 0x9f7bd12762da9315, + 0xfe9a21c65fbca281, + 0x8f2a67354a7b8fcd, + 0xacd53fb87a91ce4b, + 0x51846bcba893edb7, + 0x752e389ed8a7fc25, + 0x4e37c581f6ba2c91, + 0xc79a8652158b29fd, + 0xd8e7153324af396b, + 0xac7258b763b258d7, + 0xcb74f26ba1c69845, + 0xb964e1d87fa896b1, + 0xa3fd785a9d8ba52f, + 0x68c3279eda7ec38b, + 0xab6d7f4fea91d2f7, + 0xda6b37432ba4f175, + 0xbc6da79659a832d1, + 0x8f2bd6c656892e3f, + 0xdb2983c7647c3e9b, + 0x3e58b42ba38f5d19, + 0x34125eaed1a27c85, + 0xe1f869ddcf758ae1, + 0xfd19c28fed67a95f, + 0xdc5239721e59a7cb, + 0x73f5d6a32b6ed739, + 0x18b9dc354b81f6a5, + 0x4a56fd3a9ba62713, + 0xe5f4783cb698247f, + 0xf37e9a8dc57943eb, + 0x9a1b843fe38d6259, + 0xcb93781fe28f71c5, + 0x936cdeb651849f23, + 0x59a7ef632e549d8f, + 0xc28f9eb43d469cfb, + 0x942c3a765b4adc69, + 0xef48b918784cead5, + 0x1328b65eda821b53, + 0x76934eced76428af, + 0xe7684ac1f567482d, + 0xce5d7a82135b4689, + 0x79cd6e24324c76f5, + 0xe73bd959816f9573, + 0x23f1dc687e5293cf, + 0xec362f7a9e56b24d, + 0x9d61f2ebac47d1b9, + 0xb7d8fa2dc94adf17, + 0x69cbf7aed74cfe83, + 0x7ac6e51438512cdf, + 0x9137da8328643c5d, + 0xcdab853875364bc9, + 0xf23d4eca924a6b37, + 0x19fa758cb14d79a3, + 0x794c325cbe4fa921, + 0x853bd76dce32b67d, + 0xd3c17b61fb24c5e9, + 0x5e672b421c29e457, + 0x12cd3b86592af4c3, + 0x4c7961598a6e2541, + 0xb514cdeba851429d, + 0x54db3e9dc845621b, + 0x629e3afdc3285f67, + 0xdebf635dc1297ed3, + 0x185d6c7fef2c9d51, + 0x5f3491e32e1f8bad, + 0x82d396465e13da2b, + 0xcb6478265c14ea97, + 0x41bf83976a17e8f3, + 0xa1f9348cba3c2971, + 0xfc4ed8bba71e26cd, + 0x57c826bfe821564b, + 0xe48bd371f51364b7, + 0x58c269a436189425, + 0x1adecb37642ba391, + 0x123d78c54cea91fd, + 0x628fbc7549edaf5b, + 0x43f29dc769f1dec7, + 0x27d954cba9e4fd35, + 0x2f517d8dc8f72da1, + 0x85a4f6ced6e93b1f, + 0x7c536fe215fd3a7b, + 0xcaf6b93323df49e7, + 0x9db2a5c873f28965, + 0x1c54f3d982f597c1, + 0xab14c5687ed8a63f, + 0x632b8c487deac49b, + 0x516e9d3cbaced419, + 0x4a295d3fead1f285, + 0x5e6179254ad623e1, + 0xfeba78c549d8315f, + 0xd82c7fa545d83fab, + 0x6f2ce85874dc5e29, + 0xea4132d982cf6d95, + 0xf914b58ba2d38bf1, + 0xa9d5341cbec49a6f, + 0xdc9683e1fec6a8db, + 0x5d74e3c21ecbd849, + 0xb39e4c7329ade7b5, + 0x1f69d4587bd41823, + 0xd34e68c879c4258f, + 0x8bfa76ca96c734fb, + 0x4127af3dc4db5369, + 0xa9b63d7fe3bc72d5, + 0xc186a52fe2cf9153, + 0xc58167a431b28e9f, + 0x56ba12e43f95ae1d, + 0xe617b4a43ea6cd79, + 0xfabe2d754a89dbe5, + 0x2b316a88789dfb63, + 0x64f8bdedc7a129bf, + 0xf6d41c7fe7b5493d, + 0xad3ce911f3c647a9, + 0x5cf749b324cb6817, + 0x86d73e5542bd9683, + 0x9834b6f6519e84df, + 0x59ca8e287f92b35d, + 0x8e23b1a87e85d2c9, + 0x6a2e87dcbca9e137, + 0x42f1ba7dc87aef93, + 0x9682ba5dc67b1def, + 0xf18a3cd328913e6d, + 0x9615fdc326834cd9, + 0xe6fb7dc653a86c47, + 0xd9218fb762897ab3, + 0x91274cecb28d9a31, + 0xba1f54ea9e5fa78d, + 0x49ea583cbd72c6f9, + 0xec435611fc94e567, + 0x9f42ac821b78f5d3, + 0x3d8efcb54b9c2651, + 0x976fe8d6587e23ad, + 0xd953c14ba891632b, + 0xbf58697dc5a46197, + 0x7196a54cb2867fe3, + 0x49158fbed27a9e61, + 0x3975a6ffef4a8cbd, + 0x59de3b621e5fac3b, + 0x6dc5f7943d52eba7, + 0x2e5693b54c76fa15, + 0x91e6c4287c692a81, + 0xf28e746a985a27ed, + 0xb93de68dc86e375b, + 0xc642f83fe48165c7, + 0x435978e1f2849635, + 0x4dc96573236794a1, + 0xd6c8f3b65269a31f, + 0x48b6d3a65f4dc17b, + 0x2143a8d65a3ebfd7, + 0xc345bfea9b62fe45, + 0x89a7bd6dca562eb1, + 0x194af83ed9583c2f, + 0x96d7c1b1f64a3c8b, + 0xf9dc8672163d4af7, + 0xc74ea28436418a75, + 0x54b96c18735498d1, + 0x8e71faca9136a74f, + 0x4d31eb887f28c5ab, + 0xe28f451bae3cd529, + 0xa941d38dcb2fe395, + 0xd13c9bffeb6524f1, + 0xc459de321b47326f, + 0xa74bc196593841db, + 0x15f824b7672b5f39, + 0x7fd9ec39842d6ea5, + 0x87625efcb6529d13, + 0xbf4863adc1239b7f, + 0xe29fa57dcf15a9eb, + 0x7943ce61fe18da59, + 0xcad63e932d1be8c5, + 0xda39f1465b1ef843, + 0xbd8416987b13269f, + 0xb2f48e7a9a27461d, + 0x68a3fe9dc81a5479, + 0x6bd4527dc61b73e5, + 0xbf52ae7ed51e9263, + 0x37fc5dbfe43291bf, + 0x24f738665314af2d, + 0x1b3adcf32df4ce89, + 0x7589bed43ae7dcf5, + 0xca1d7fe659eafc73, + 0xdc71b84767ed1acf, + 0x4253dcecb8f13a4d, + 0x5e2739ced6f348b9, + 0x56da127fe4f86927, + 0x8edc497214fb8793, + 0xb54e168432db85ef, + 0x172c6af651efa46d, + 0xda2c19f76fe2c3d9, + 0x3dac2bfa9cd6e247, + 0x1c38457a9ad8f1b3, + 0xc8f51a7edaec4231, + 0xb5783adfe6bc2f7d, + 0xeba47f3327c14de9, + 0xa5346b1328e36d57, + 0xf6d13e2654e67bc3, + 0x1d2fca9873ea9b41, + 0xe29854c761eca89d, + 0xd189ec587eafc81b, + 0x5a3842ecbdc2e687, + 0x4cb5e73edab5f6e3, + 0x9c8b71a43cda2761, + 0xdc2948f438ca24bd, + 0xa523b74768ce543b, + 0xa841d3ea98d162a7, + 0xd3f1895cb7d69215, + 0xcaf6543cb3c69f71, + 0x95841f2cb1a78ecd, + 0xc8bda31fef8cad4b, + 0xa37d86b21e8fdcb7, + 0xbc6d1fa54da3fb25, + 0xb2f1a7865dc62b91, + 0xb86da7c659a728fd, + 0xcd4238ea97ac386b, + 0x83e1d9ccb5ae46d7, + 0x3c59b86fe6c19745, + 0x2631bd91f3c495b1, + 0xbc6349f213b7a42f, + 0xdfb28ea541a9c28b, + 0xbf37d1854e8bc1f7, + 0x21d389554b8edf65, + 0xc4ef37598b942fc1, + 0x6ca2ef7cba962d3f, + 0x864f751fe6873d9b, + 0xb783e461f68b5c19, + 0x826bf4d2149e6b85, + 0x6d7ac39545a289e1, + 0xe2c357176293a85f, + 0x8ad3c4687185a6cb, + 0xd315a4698f7ad639, + 0xcbe8a4da9d7ce4a5, + 0x168347adcb8ef513, + 0x8395cfbfeb94237f, + 0x4c7ead521a8642eb, + 0x452cbe843b8a6159, + 0x7dc9a1f4347a6fb5, + 0x23edaf6a957d8e23, + 0x1de5c4fba3619c8f, + 0x8512e47dc1639afb, + 0xb8495fadcf45db69, + 0xa76e3121fc48e9d5, + 0xd52349721d6cf953, + 0xe6f591c43b5e17af, + 0x579ed4876b83472d, + 0x73dc2fbbab764589, + 0xcefda49cb86974f5, + 0xbe91a3fed56c9473, + 0xf5c7394cb35d82cf, + 0x61cb2a51f372b14d, + 0x4c873d932153cfa9, + 0x46ca21843f46de17, + 0xeb2f4ca65c49fd83, + 0xedf152b7694a1bdf, + 0xcb9f3429894f2b5d, + 0x728f13ced8524ac9, + 0x61bfd38fe9456a37, + 0xe96bc241f54978a3, + 0xf29a18c4365ca821, + 0x7cb65e35423ea57d, + 0xa1d589287251c4e9, + 0x5317c6ba9f24e357, + 0xb71ce8da9d47f2c3, + 0x719ed63dcd6b2341, + 0x8da3479fea4c319d, + 0xb9a8273dc72d3ef9, + 0x5ba876d21a325e67, + 0xe1b39cf548257cd3, + 0xba892c5876389c51, + 0x4de398f7632b89ad, + 0xf3524bd9813ec92b, + 0x1a46e7dcbf21e897, + 0x147def3cbc14e7f3, + 0x7d32cba1fd392871, + 0xb5dfc7443b1925cd, + 0x784ef2b76a1d354b, + 0x853e9a27691f53b7, + 0x2c5d47acba149325, + 0x3fb1de8dc736a291, + 0xd2f36c9ba3168fed, + 0x15a749eed219ae5b, + 0x65f1d2ea9efabdc7, + 0xd72e94521bdfec35, + 0x37d6c8e65df42ca1, + 0xb7e82d165be63a1f, + 0x138d2c465af8397b, + 0x67f8214a96fb48e7, + 0x412367fcb4fe7865, + 0x52f91e7ed5f296c1, + 0x84e7512ed2e4a53f, + 0xcb579a4212f6c39b, + 0xd8c29fa652fad319, + 0xd28ca6e54fdce185, + 0x2b39e6d659acefd1, + 0xe17f54298ac32e4f, + 0x1d72c65a98d53eab, + 0x7ebda62dc7e85d29, + 0xa298e141f4eb6c95, + 0x693fc57325cd7af1, + 0xce2bd69434d1a96f, + 0xe47b2d3652e3a7db, + 0x15d2ab7981e6d749, + 0x4afbde887fc9e6b5, + 0xaf3e17ca9dbcf623, + 0x79842dfdcabe148f, + 0xc9762a4fe9c243fb, + 0xcfe426a21bd75269, + 0xf189c42438c971d5, + 0x91af6c8656cb8f43, + 0xa9387fc653ac7d9f, + 0x4f1dc79984b2ac1d, + 0xf5b376cba1b3dc79, + 0x6c59831cbf96dae5, + 0x75a9fb3fedb9fa63, + 0xb8f35d432d9c18bf, + 0xe2361cd54baf283d, + 0xed7ba2165bc246a9, + 0x473fd8aa9ac58617, + 0x6ad7419cb6ca9583, + 0x1537289cb49a83df, + 0x951248adc39ea25d, + 0x57426d91f3a2d1c9, + 0x1b85e7d431a4df27, + 0xfa1ec6332d86fe93, + 0xe79fb1654b781cef, + 0xa7becd265a8b2c6d, + 0x837bd1e7687f3bd9, + 0x694e12aed9a26b47, + 0xa96b571fe6a579b3, + 0xb5d7c4e1f5b8a931, + 0xad4b53f2137ba68d, + 0xac58f4e4327db5f9, + 0xe421a9b982a1e467, + 0x2cf96e887e85f4d3, + 0x29145edcbea92451, + 0x18375c4cbc7932ad, + 0xd5f3426fea8d512b, + 0x4123ac6ed96e4f87, + 0xdb7f8a3219827de3, + 0x2f819d7437859d61, + 0x75af86d543568abd, + 0xab5214d87269ca3b, + 0x53a4cb29815ed9a7, + 0xa2e758ccbe72f915, + 0xcf4eb98ede752981, + 0xce16b871fb5726ed, + 0xa67294d21d7a365b, + 0xe3794ad32a6d54c7, + 0xf73cd9b76a7f8435, + 0x6c73e24cb87493a1, + 0x1fd2a79cb576a21f, + 0x6712bd3dc247af6b, + 0x2f36a8bdc149bed7, + 0xe2453c9cbf3ced45, + 0x956abe254f632db1, + 0xdf5b81e54d653b2f, + 0xf32e91765d463a8b, + 0x73de1f976b3a49f7, + 0xa4c7e31cba3d6975, + 0xdc925a6cb64f87d1, + 0x13bf8e9ed752a64f, + 0xba2e47d1f235c4ab, + 0x72c3e9421358d429, + 0x482bcf37614be295, + 0x9f57dce76d4ce2f1, + 0xa1f4d72a9d52316f, + 0x2dfca6998a243fcb, + 0x61a9785dcb275e39, + 0x165b9d4fe8296da5, + 0x7c621d31f74d8c13, + 0x5a48b962152e8a7f, + 0xacd986f54532a8eb, + 0x9ec4b5d87324d859, + 0xdc84a35a9128e7c5, + 0x12f436da9e1bf743, + 0xf82db57bac2d159f, + 0xad624c7fec32451d, + 0x374e95b1fc145379, + 0xdf29cb443b1872e5, + 0xeab32d865a2b9163, + 0x3789a1e5451b7eaf, + 0x9125fba8751f9e2d, + 0x86d34c1ba412cd89, + 0x1937426ba214dbf5, + 0xe345bcfbade6fb73, + 0x1b9f584edbe819cf, + 0x945e36721bfc294d, + 0xfd34eb632aef37b9, + 0xab418fc65bf36827, + 0x3124ea687af58693, + 0x43eba7fa95d784ef, + 0x4a7dc18a94fba36d, + 0xbc1d876ba3feb2d9, + 0xc4ab895ed3f2e147, + 0x746bde5321d4efa3, + 0xad7c8b965ed83f21, + 0x7c28d9654bc92e7d, + 0x8b41f67658db3ce9, + 0x43ec61d989df4c57, + 0x28f7ac3cb8e27ac3, + 0x1ac5673ed7e69a41, + 0x875d6a31f3e6a79d, + 0x1bfa7e9324eac71b, + 0x76b8c1f432ced587, + 0xb4dca13872c1f5e3, + 0xf236e5da9fd72561, + 0x1b2fd6e98ec723bd, + 0x8bae7f4a9cda523b, + 0x2bc867afe9cd51a7, + 0xb7356f8dc7ad6ef3, + 0xa149c5b328c39e71, + 0x543dbe1325a48bcd, + 0x6bea1f7653d7ac4b, + 0xacedbf1652c9dab7, + 0x2bed149981bdea25, + 0x75e86facbfc32a91, + 0x2d9658fcbca427fd, + 0xd1e9a371fdc8376b, + 0x4acb85721cba45d7, + 0x84cb61a32abd8645, + 0xc17bf83657af84b1, + 0xd72b4cf987b4a32f, + 0xdb8a15ea94a5c18b, + 0x5fb2794ba296bfe7, + 0xadb372fdc19ade65, + 0xcdb9f45bae7bfdc1, + 0xf876ec354e912c3f, + 0x3fed6a432e843c9b, + 0xcea81b254da75b19, + 0x86b15f954c9b6a85, + 0xf9ce74bba69c78e1, + 0x8947a61cb48e975f, + 0x7d1fc56fe482a5cb, + 0x5dc92a31f2a6d539, + 0x94fcbd221298e3a5, + 0x5eb98717629bf413, + 0xc87941e65e8d127f, + 0x4513b8c87d8241eb, + 0xdf2e473bac835f49, + 0xa8ef57ddca876eb5, + 0x692481afe97a8d23, + 0x563bda4fe45c7b8f, + 0x3e79cf82145e89fb, + 0x6c2f57d43472da69, + 0x153fbde76274e8d5, + 0x731b9feba179f853, + 0x567e24998e5b16af, + 0x72cd83fbac7e362d, + 0x93fa8d5fed715489, + 0x932c45ffeb8473f5, + 0x3ca7d8e21c689273, + 0x729db1f4375981cf, + 0x2ae736f5465b9f3d, + 0x9751ad47634fbea9, + 0xef297c5ba463ed17, + 0x37fad2ecb165fc83, + 0x29d145acbe471adf, + 0xb3c8d911fe4b2a5d, + 0x84ae57c21d4e38c9, + 0x857ed6154d516937, + 0xf25ea7c76c5487a3, + 0xc8fa71da9b58a721, + 0xad61847cb639a47d, + 0xb4df256ba54cb3e9, + 0x8f2b65adc34fd257, + 0x92d3c47fe264f1c3, + 0xde745af765783241, + 0x3f5719d54e372f8d, + 0xa87fecb65c2a3df9, + 0x62d415a98b2e4d67, + 0xcd437b1a9a417bd3, + 0x6437b2ceda349b51, + 0x31b28f9fe62598ad, + 0xe58a31d1f539c82b, + 0xb348ea72142cd697, + 0xfa493dc6542ed6f3, + 0xe5432dfba3542671, + 0x5bc932698f1624cd, + 0x48e5b37bae19534b, + 0xd37c821bad1c52b7, + 0xc37165eedb3e8125, + 0xf87264cfea329f81, + 0x7b6e59c327138ced, + 0xc5972ba43716ad5b, + 0x718baed65418dbc7, + 0xf7ce29d9841ceb35, + 0x3bdfe5a9832ef9a1, + 0xb3d4186bade2391f, + 0x34fb52edcdf4387b, + 0x6f4b921edbf846e7, + 0x645f82321cfb8765, + 0x6cd2a49439fd85c1, + 0x7da41e3657de943f, + 0xa4c3e2b876f3c29b, + 0x8349de1ba5f6d219, + 0x78159e3ba2e8df75, + 0x274651dba2c9fed1, + 0x54f16b3baebc1d4f, + 0x6f9be5132fe13dab, + 0x6ac521943de45c29, + 0x1b7d9e843ce76b95, + 0x782d693658da79f1, + 0x1fa3ceb875dc986f, + 0x61b329e984cf96db, + 0xf358b6ddc5e2d649, + 0x538129d1f2d6e4b5, + 0x4357ea2214d9f523, + 0xf829e13652db138f, + 0xb8ed32165ead32fb, + 0xb52693498ed25169, + 0x623a49598ab36fc5, + 0x82935eacbac78e43, + 0x8361ca7ed5b87c9f, + 0x4d38c971f5ac9b1d, + 0x3564d8c214afcb79, + 0xfce8a56434b2d9e5, + 0xeca632b872c5f963, + 0x52c918e762c817bf, + 0x75a12df98fab273d, + 0x7fe59b498dbe35a9, + 0x5c71b2ffedc28517, + 0xd8e3c9a1fbc59483, + 0xe4c56a8219a682df, + 0xac5fd94437b9a15d, + 0xe7a4c6d4347cafb9, + 0x3f547217649fce27, + 0xd5a9267984a2fd93, + 0xf56c24eba2951bef, + 0xdb3186fdcf982b6d, + 0x381e7421fe7b3ad9, + 0xb4ce39a21d9e5a47, + 0x3f6b27954da178b3, + 0x5afb97c76cb5a831, + 0x97b8f2154796a58d, + 0xe567b24ba578b4f9, + 0x46829e5cb49cd367, + 0xfc89765cb48fe2d3, + 0xce746581f4b62351, + 0x5f8a1dc5429631ad, + 0xfb459dc43e784f1b, + 0x7fa1dbc43d6b4e87, + 0xb2cd6ef65a7d6ce3, + 0xb45319ebab829c61, + 0x15aed64dc76389bd, + 0x857abd2fe576c93b, + 0x35a1d6e1f359d8a7, + 0xf34b8c93247ce815, + 0xa2cf1935437ef681, + 0xcde9fa18718325ed, + 0xf1e5827a9f87345b, + 0xf7db365bae6953c7, + 0xf15637acbd7c8235, + 0x832c1b5edb6e82a1, + 0x9f2a74bdc7518efd, + 0xf3cb6e421853ae6b, + 0xdaeb81432645bcd7, + 0xb14e6df87369ec45, + 0x58ea3c18735cfab1, + 0x7f3c65aa936e1a2f, + 0x16a7ed9dcf52398b, + 0x91e438ddcd3548f7, + 0x18b79431fd3a6875, + 0xa8be95132c4b86d1, + 0xd7b3e6432a3d954f, + 0xd179f8c76851c3ab, + 0x6dbefc8ba865d329, + 0x62c78efcb647e195, + 0x7cdbf85ba348dfe1, + 0x64b91e8dc24b1e5f, + 0x7c63e52bad3f2ecb, + 0xc75d83b21f425d39, + 0x8b97c2a43e246ca5, + 0xf5c9db876d498b13, + 0x2bfeda765a2b897f, + 0xf23c7a99862d97eb, + 0xfe4b13ddc831d759, + 0x812796bed723e6c5, + 0xd7b9481fe528f643, + 0xe743a863253a149f, + 0xf2d84318725c341d, + 0x4fd2a9776e1f4279, + 0x237bce5a9d2371e5, + 0x784ceb5bac168f53, + 0x297513dcb9167daf, + 0xa43568ffe71a9c2d, + 0xb67153e1f51ebc89, + 0xce28f1743721daf5, + 0x34da6e965614fa73, + 0x23b86ad8742618cf, + 0x4bfde23a931a284d, + 0xe1b49d387efc36b9, + 0x7c8635dbacfe5627, + 0x84b6e32edcf18593, + 0x9b746d3dc9d483ef, + 0x3678ecf219f7a26d, + 0x57da426436f8b1d9, + 0xa98fd2e545ebcf37, + 0xed9f23b764cfdea3, + 0x384fc6dba6f53e21, + 0x2e83975ba1f52c7d, + 0x413e9c8bafd73be9, + 0xe1a637b1fdec4b57, + 0x85763be21bde69c3, + 0x637d4ce65ce2a941, + 0x56e98dc548e3a69d, + 0xe821da9658e7c61b, + 0xdcf8e45a95ead487, + 0xd184f35a95cbd4e3, + 0x827a3fccb4cef361, + 0x7c5e8ba1f1e432bd, + 0xebc9da5542e7513b, + 0xea79f1332ec84f97, + 0xe6a52cf54cba6df3, + 0xe83f7ca65abe8d71, + 0x1c2f4ea767b18acd, + 0x15e286aa97d3ca4b, + 0xb3d1527fe4c5d9b7, + 0x94e826d1f4cae925, + 0x5f467de324bcf791, + 0x15e2b96543ae16fd, + 0xb94efa3981d2356b, + 0x46f21dc98fb654d7, + 0x8ca521da9eca8345, + 0xb2e48f7a9dac83b1, + 0x61432a8dc8ad912f, + 0x5a61c98fe691af7b, + 0x92c3eb521693bde7, + 0xfe8c47a324a7ed65, + 0xd9c4e3b65498fbc1, + 0x3248e5b8749c1b3f, + 0x8659e4b8718f2a9b, + 0xab29176dcfb35a19, + 0x7fb519eedeb46985, + 0x6a89d721fca987e1, + 0x8ce5f6321c8b965f, + 0x893b54d3287e94cb, + 0x4d73285768a1d439, + 0x6c9b23198794e2a5, + 0x59ae7cfcb6a8f213, + 0x175dae9dc49a217f, + 0xbd562f9dc17a2fdb, + 0x6b95fe4dcd7f3e49, + 0x39867fd21f826db5, + 0xe736cb254e968c23, + 0xf9da48643c567a8f, + 0x2bd79fc5475a98fb, + 0xd2eb678ba75ec869, + 0x7a5e194cb681e7d5, + 0xb1ec842ed694f753, + 0x26df154fe38715af, + 0x72c6ea82148a352d, + 0x2d6f79b6517d4389, + 0xda6b38954d7e62f5, + 0xf89b514bae849173, + 0xeb6912f98a547ebf, + 0x451df87cba579e3d, + 0x2d6cb7afe648bda9, + 0x597e8b61f65edc17, + 0xae6f5cb32761fb83, + 0xfec1b274356419df, + 0xbe57d2198367295d, + 0x261a4399815a37c9, + 0x96257b4baf4d5837, + 0xd264c91cbd4f76a3, + 0x485263bfed74a621, + 0xed82a761fb45a37d, + 0xe4d596b21a47b2e9, + 0x1af9e764394bd157, + 0x18de23b6564cdfb3, + 0x4691783ba8742f31, + 0x4b2fcd3ba3542e8d, + 0x697ef4acb1463cf9, + 0xf567ba1edf2a4c67, + 0x4de937c1fe2c6ad3, + 0xb71d94c32d3f8a51, + 0x85bad3f54c3297ad, + 0x4dc5f2876a35c72b, + 0x7d8e2fc76a28d597, + 0x6ecd7aba972ad5f3, + 0x81f637ccb63df471, + 0x83fb614fe65123cd, + 0x169ca7d1f136524b, + 0x93e72f85423851b7, + 0xcad39b854e2a7f15, + 0xe92da4665d2c7e81, + 0xb2946c86591f7bed, + 0xf257b6e98912ac5b, + 0x87dc932cb814dac7, + 0xeb9af67ed718ea35, + 0x7ba6d8ffe52bf8a1, + 0xf6bc5985463d281f, + 0xfd561e798521367b, + 0x8abc617a921345e7, + 0x7dac6fea9ef78465, + 0xe2341dc87df984c1, + 0x24a31de98aeb923f, + 0xd345e89dc7fea19b, + 0x9427abedc6d1bef7, + 0x6fc849a218f3de75, + 0xaed4617435e6fcd1, + 0x8efd7bc765e91c4f, + 0x7b4c59e763fd2cab, + 0x94efd75981ef4b29, + 0x928e537cbfe26a95, + 0x534ec9fcbcd578f1, + 0x4f25619febd8976f, + 0xce94f27218ea95db, + 0x69b1ae5328dec549, + 0xb1485d9768d1e3b5, + 0x17c4b8aa98d6f423, + 0xbcf6429ba5d7128f, + 0x539d281ba4d931fb, + 0x41d39cacb1dc3f59, + 0xe648c39cbdaf4ec5, + 0x95fb38e21fc28d43, + 0xd96135732dc47b9f, + 0xe326a9554bc79a1d, + 0x72ba619546dbca79, + 0x129a364876adc8e5, + 0x8a42fd1cb7c1f863, + 0x34b7169ed5c416bf, + 0xd2ab6191f4c8263d, + 0x649e832212db34a9, + 0x34b1869652cd6417, + 0xdc78bf965ebf7283, + 0x4fe892d76ca381df, + 0x8b3d5ce87ba59f4d, + 0x682d5b3dc786aeb9, + 0xbf417dafe69acd27, + 0x371cdb81f58dec93, + 0x8f9257a436921aef, + 0xa12ef48435b42a6d, + 0x83e791c652b638d9, + 0x6d1af72981cb5947, + 0x963ed7298f9d67b3, + 0x2c63fe8cbdaf9731, + 0xcdf897afec92a48d, + 0x82b9f3cfea85b3f9, + 0x9bdc48a21ba9d267, + 0xbae7c2f5478ae1d3, + 0x139ade46568cef41, + 0x695fa13875812f9d, + 0x17f8e34ba3954e1b, + 0xfab6875dc1a64d87, + 0x4e2985adcf796be3, + 0xbd49e171fe7d8b61, + 0x35d8b9e21c5f78bd, + 0xd3c986754d72c83b, + 0x7bd5e8643b84d6a7, + 0x2dcb13876a89e715, + 0xd2763e4ba67bf581, + 0x319b265ba57c14ed, + 0x24f5371fe691435b, + 0x65a27b91f19452c7, + 0x385cd21542a98135, + 0xd642f1743e5a7f91, + 0xc2e697143b4a7cfd, + 0x8b63daf65a4f9d6b, + 0x742ef6998952cbd7, + 0x1ba5493dc976eb45, + 0x3ebfc8aed657f9b1, + 0x9cb3f85fe56b192f, + 0x3268b942145e278b, + 0x4fa8dec6538146f7, + 0x1c3b7f9ba1938675, + 0xd2a58fea9f4785d1, + 0x4fe75b698d5a934f, + 0xbc5d23498c4d92ab, + 0x58b917eeda5fc129, + 0x6dc9f35fe942df85, + 0x518cadb32845fde1, + 0xc7a6fe1437481d5f, + 0xb74825a765492dcb, + 0x15d3fc29825e4c39, + 0xa29763edc2416ba5, + 0x637dfabdcf458a13, + 0xd1fea39dcd25987f, + 0x3b7a5891fc2896eb, + 0x65b37fa21b2dc659, + 0x678fb5c4392fd4c5, + 0xe4917cb98a62f543, + 0x49b7cdeba846139f, + 0x83dcf72cb759431d, + 0x39ba781ed53c4179, + 0x8af6d51cb12c4fd5, + 0x4a3612cedf218e53, + 0x743a6db32e137caf, + 0x7586d2c54e169b2d, + 0xd6b7ef354d17cb89, + 0xea482d77681bc9f5, + 0x3467bd2ba81fe973, + 0x3159fadcb82317cf, + 0x92fd4b1fe816274d, + 0xc4189231f41835b9, + 0x6d548ea4341c6527, + 0xf1eb2597621e7493, + 0x1b9f2c754bcd72ef, + 0x1fed2a887cf3a16d, + 0x8c1a57b768e4afc9, + 0x7ef3812ba9f8ce37, + 0x2dea861cb6f9eda3, + 0x2a56cfdcb6edfc21, + 0x12af7c5436f12b7d, + 0xcf615a7325f43ae9, + 0x9a2f34d762f84a57, + 0x543ab8e871fa68c3, + 0xd18c4af87fed9841, + 0xca941ef87bcf859d, + 0xf465e71edae3c51b, + 0x6d248b51fae5d387, + 0x6e32adf219c8d2e3, + 0xb15e639548dbf261, + 0xc6deb87656ce21bd, + 0xa4e3b2d986d14f2b, + 0x286db73ba2d34e97, + 0x691f42dba1d76cf3, + 0x9ea1234cbfda8c71, + 0xc7894151feab79cd, + 0x427b39e21dcfa94b, + 0x542efab43ac2d8b7, + 0x9fcba3254ac6e825, + 0x7dfc246657c8f691, + 0xbf29c4d986ba15fd, + 0xb86e2c7ba5ce246b, + 0xdc56214fe4c153d7, + 0x61283da1f1d68245, + 0xeadc716543d782b1, + 0x7cf541243da98e1f, + 0xae81fb543d8c9e7b, + 0x135ec9d5498face7, + 0x46da25f989a2ec65, + 0x427dc6ecb795fac1, + 0xf6a8193ed6b81a3f, + 0x439ec5a1f4ac289b, + 0x6bd7c3f325be4819, + 0x359cfeb543c16785, + 0xa31e84b872b486e1, + 0xb2e3cd776ea7945f, + 0x47e91df76e7893cb, + 0xef41dc5bab8dc239, + 0x38bef27dc98fd1a5, + 0x14297fadc783def1, + 0xb6d4af7328951e6f, + 0x462f98e435872edb, + 0x4132fa87658b3d49, + 0x4def6b38728e4cb5, + 0x42519abdc4a18b23, + 0xdac9548cbe63798f, + 0xf6dbea7dcd6597fb, + 0x169db481fd5ac769, + 0x57d9fe621a7bc6d5, + 0xfd75ce432a8fe653, + 0xf431ce27698314af, + 0x8fd62c3ba897342d, + 0xa6378e1dc57a4289, + 0x79e8db2dc38b61f5, + 0x25349e6dc18d7f63, + 0xdb2f765dce517dbf, + 0x3f4de8921f649c3d, + 0x6bfa43132e45bca9, + 0xf318d6c54c59db17, + 0x23a49877695cea83, + 0xb6d314e9864ce7df, + 0x256ea47dc973285d, + 0x2b6fc9dfe47536c9, + 0x15e26431f28a5637, + 0xa96fe8d2126c75a3, + 0x7c34bf87637e9521, + 0x2a597e476f51a27d, + 0x89eb5a287d54b1e9, + 0x85bf3c1a9b36cf47, + 0x193678bba948deb3, + 0xb97e621dc85bfd31, + 0x75ba31ffe64f1c8d, + 0x4be53fc217523bf9, + 0xd8473fa328354b67, + 0x5be614a8724869d3, + 0x8716d59ba24c8951, + 0x8de192387f2e86ad, + 0x546f1cebae41c62b, + 0x2b8547ffec23d497, + 0x1265934fea27d4f3, + 0xb615a7f32b4af371, + 0x7f29c6b6584b12cd, + 0x9daef828785f314b, + 0x235b67ea96324fa7, + 0x976a1c5cb4367e15, + 0x86d3125dc2397d81, + 0x95f4871cbf197aed, + 0x8dce1461fd1e9a5b, + 0x4d27c1e43e21d9c7, + 0x1c8fb2476c14e935, + 0x9c4d38a65b26f7a1, + 0xa6c73de9893a271f, + 0x35879dcba81d257b, + 0x3581e7acb61f34e7, + 0xf3d9578fe7128365, + 0x1e9348b1f42683c1, + 0x4c26b8d65428913f, + 0x956ba7432de79f8b, + 0x7e4cdf2439ebadf7, + 0x261f7a3549efcd75, + 0x4beac26878e3fbd1, + 0x56fcb3eba8e61b4f, + 0xf52369eed5f729ab, + 0x3154c76fe5fc4a29, + 0xc236d5a213fe4895, + 0x743e98b654e287f1, + 0x863dc45871e3956f, + 0xa64d8f965fe694db, + 0x8ac52f187deac349, + 0xa352efb989ecd2b5, + 0x73cf29dcb9cfe123, + 0xcbf9d62fe9d4218f, + 0xc2b36d4217c52feb, + 0x948a3fd326d83e59, + 0x9eb231a763ea4dc5, + 0x1b9dc3a982de7c43, + 0x614279f982d17a9f, + 0x6d7cfe998fc4a91d, + 0x16a24cdcbed5c879, + 0x418dc2e1fab9c7e5, + 0x946d73a21abce763, + 0x59c3ab73279de4bf, + 0x9c52631879c4253d, + 0xf635c9a987d643a9, + 0x5dfa2cecb5da6317, + 0xaf63417cb4dc7183, + 0xb9cf846ba19b6ecf, + 0xb9356e4dcfa19e4d, + 0xa59ed4321f83adb9, + 0x5dcbfae43ea6dc27, + 0xa291e7854ca8eb93, + 0x62c9a755467ad8ef, + 0x32547be987af196d, + 0x5e68f37dc6b237d9, + 0xabc3152fe3c65847, + 0x3c6248e1f2c976b3, + 0xefa3c4d324bc9631, + 0xb26e7df541ae938d, + 0x873cad465e81b2f9, + 0xe153d7c98ea4d167, + 0x64c93d587a86dfc3, + 0x3ec5862cba89fe41, + 0xe49f7a1dc67b1e9d, + 0xb198a36fe68f3d1b, + 0xbd32968216a24c87, + 0x1e38ab4324956ae3, + 0x4c9fbe1653b98a61, + 0x4f98ab76516a87bd, + 0xc6df24598f6ea73b, + 0x94fcda1cbe81d5a7, + 0x752f1acedc94e615, + 0xa6941f2feb97f481, + 0xa4879f532a7913ed, + 0xde825fb5498d325b, + 0xcf6eb126568f41c7, + 0xc15fb36ba6937f25, + 0x7125f3ecb3857e91, + 0xe5c26f9ba1567bfd, + 0xa638fecedf4a9c6b, + 0x24c6e8d1fc4ebad7, + 0x5f6794832d71ea45, + 0xf975d4143c64f8b1, + 0x4eb781965b67182f, + 0x6d4a1fe8795a268b, + 0x6d74c1fba86c35f7, + 0x96b382edc38f6475, + 0xb6d7253fe57384d1, + 0x6147352fe176924f, + 0xfa764284325791ab, + 0x615fc8a43e4abf19, + 0xcb2fe8654b3dce85, + 0x8e41fcd87a52fce1, + 0x5fba148a9a641c5f, + 0x8234691ed8462acb, + 0xdc9b532fe75a4b39, + 0x38a624b1f63d49a5, + 0x4b1af783265f7913, + 0x7ad4e2665342967f, + 0x8f5a6398713495eb, + 0xe98423b87f28c459, + 0x352e1a498e2ad3c5, + 0xd1c9eb6bab5de243, + 0x1746af3edb53129f, + 0xc24d6981fa56421d, + 0x829ae6c21a273f69, + 0x48e59bc437294ed5, + 0x43ecb7d9862c7d53, + 0x2c9b81a8732e6baf, + 0x9c54638cb1439a2d, + 0xa73f251cbf14ca89, + 0x7d4156ccbd17c8f5, + 0x83415bd1fc1be873, + 0x1e594733291be5cf, + 0xaed39f587b31264d, + 0x94cd38a87a1534b9, + 0x2c9af47cba196427, + 0x2e54176dc61b7293, + 0x9327cdbba42b71ef, + 0x3876a2dcb21e8f5d, + 0x5182cedcbdf1aec9, + 0x8afc2eb21ef4cd37, + 0x49e61c732bf6eca3, + 0x76f84c165ae9fb21, + 0x7cba912658fc1a7d, + 0x39ec1a8876df28e9, + 0x672539adc8f24957, + 0x2b13e46ed4f567c3, + 0xdb2384ffe3fa9741, + 0x47fd5b3212fb849d, + 0xc6ab189652fea41b, + 0xf316bce65fe1d287, + 0xe2a3c8187bc5d1e3, + 0x54e9b1a98ac7ef51, + 0xb3c81a7a97c81fad, + 0x37d5e62ba7dc3e2b, + 0xc54b837fe5cf3d97, + 0x6c3472a217d26bf3, + 0xc7e4a85434e58b71, + 0x2bef8ac542e678cd, + 0xe8fa315761eca84b, + 0x1c6b79e65faec6b7, + 0xb29df43badc1e725, + 0x748f16eedbc4f591, + 0x1398a7bfe9b714fd, + 0xb287af4219da236b, + 0x2b1f6c5438bc42d7, + 0x3ae7958768cf7145, + 0x47a691c985c37fa1, + 0xdec7123a93b58d1f, + 0x7edf34bba1c69d7b, + 0xa74bfe6dcf89abe7, + 0x823be591fc9edb65, + 0x9e6df2c43da2f9c1, + 0x5c1e3d954cb5193f, + 0x6735db954ac6279b, + 0x1e9c8d3768cb4719, + 0x91537d2ba7bd4685, + 0x5e47ca2cb4af75e1, + 0x16ae493ed4b2935f, + 0x12c58b31f1a592cb, + 0xfac7652542b8c139, + 0x71d6ca832e7acf95, + 0xe82a6c554a7bcdf1, + 0xf9528be87b921d6f, + 0xa96814f879842cdb, + 0xb674ea5ed8a73c49, + 0xa3d24b8fe6894ab5, + 0x92e4c3a1f59d7a23, + 0x673c9f82139e678f, + 0x71cab8f5438296fb, + 0x31a6b2e871a4c569, + 0x73ab98c76f78c4d5, + 0xa7ce82da9d8be453, + 0xbaec7569896ce2af, + 0x6c12493feb91432d, + 0xd72b51c1fba54189, + 0x657cfd2219874fe5, + 0x8c36a973258a7e63, + 0x28dcfb35435a6cbf, + 0x49fd5ae8726f8b3d, + 0x647f53b98162cba9, + 0x36e81cdcbf65da17, + 0x6eda542dcd57e983, + 0xe876294dca49e6df, + 0x1bc693532b6e175d, + 0xb17d2fe54b7135c9, + 0x6b94cea98b946537, + 0xa3f5e16cb96874a3, + 0xf514763dc67b9421, + 0xf34265ecb35c917d, + 0x5ac3d81cb14e8fd9, + 0x2467fe3edf52ce47, + 0xb5fc86d21f45edb3, + 0xe953d6c54d58fc31, + 0x12b37da65c4a1b8d, + 0xc7145987684d2af9, + 0x41ead72dcb514a67, + 0x2617fa9dc95468d3, + 0x297c415fe6479851, + 0x2a7c6d31f23985ad, + 0xe69253b2134da52b, + 0xa72dc896514fc397, + 0x1964df287e54d2f3, + 0x472bc8ea9d46f271, + 0x61b4d32a9b4821cd, + 0x5b269aedc94a2f3b, + 0x3e2f567dc82d3ea7, + 0xc87be351f9427d15, + 0xa57e918329347c81, + 0x72c48594342579ed, + 0x35d82eb76328a95b, + 0xd398c147612db8c7, + 0x2386fbaa9e1fd835, + 0xd37851ccbd23f6a1, + 0x67f54beedc37261f, + 0x29a18361fc19247b, + 0x6e83d1f32a1b43e7, + 0xeafc1bd54a1e7265, + 0x8ae39db8794382c1, + 0xa6b3c18a96148e2f, + 0x4c8219dba3159e8b, + 0x4cae753cb218acf7, + 0x7adb8cfa9efadc75, + 0x1c9625ecb9fcead1, + 0xb6149fa43ce21a4f, + 0x4cae8db43cf428ab, + 0x734bf2965bf74829, + 0xb5c972a768fb4795, + 0x17dc62fa95ec76f1, + 0xc3b8754ba3de846f, + 0x94b5e8fdc4f293db, + 0x48d3c56fe1f6c249, + 0xa9feb8d432f8d1b5, + 0x87bd5ae54ecadf13, + 0x162efdb439abed7f, + 0x31f289e769c12deb, + 0xf12bc3598ae43d59, + 0x83b2415ba8e74bc5, + 0xfb32749ed6ea7b43, + 0xd3f4c67fe3dc689f, + 0x135b4ae324cf981d, + 0xf39185c543e2c679, + 0x352dba6871d4c6e5, + 0x1ef3c9487fc9e563, + 0x98e7ab276ca9e3bf, + 0x81a6432a9abe143d, + 0xd2f6345febd142a9, + 0x6c4857d1fad56217, + 0x7ac2956219c86f73, + 0x135b6fd324a86dcf, + 0xb9f8cd6653ab8c4d, + 0x9f37ab2652af8cb9, + 0x1f63a2ba91c3db27, + 0xd46ef3a98fb5ea93, + 0x19b34c2bab96d7ef, + 0xec84bd11fcab186d, + 0x576def821bae26d9, + 0x9e58d7443bc15647, + 0x1dfb729769c475b3, + 0x597c23eba7c89531, + 0x41f39a5874ba928d, + 0x378d965cb38ca1f9, + 0x34b85aedc19ebf57, + 0x5f73c14cbf82dec3, + 0xf3a9cb632e96fd41, + 0xe82d5a743e871c9d, + 0x614dfe865d8a3c1b, + 0xd64b8a165a9e3b87, + 0x4d987cecb8a169e3, + 0x53927e8ed7b48961, + 0xd86ca15fe39586bd, + 0x9d15a471f289a63b, + 0xf38a4bd2128dc4a7, + 0x574a23d7629fd415, + 0x741c2de76e94f381, + 0x49ce8f687c8612ed, + 0xf68cbe5bad89315b, + 0x581f76ddc96a3fb7, + 0xb83529ddc98d6e25, + 0x2c15eb81f6827d91, + 0xea396b8215637afd, + 0x698d375323759a6b, + 0x31e9f8a54258b9d7, + 0x5bd12ec9817cd945, + 0x3af247c98d5fe7b1, + 0xae63751cbd84172f, + 0x614ac27fed76258b, + 0x51d7ba3feb6934f7, + 0xbfa74e921b8c6375, + 0x29f7ac55496e73d1, + 0xf185c9476872914f, + 0xcb8f34a874538f9b, + 0x7915eb2ba356be19, + 0x2d675c3cb149cd85, + 0x23b7f5da9f4adbe1, + 0xd9a124bdcb3dea5f, + 0x82bca9d21e5329cb, + 0xe73b4f932d564a39, + 0xea7c43276c3948a5, + 0xd2ba3cfa9a5c7813, + 0xf642db1ba63d857f, + 0x2db43aedc65194eb, + 0xf1bd936fe264c359, + 0xb6ec3241f147d2c5, + 0xc78fbe96526ae143, + 0xfa5c64743c2ade8f, + 0xae43bd665a3d1efb, + 0xd1c2b9698c423e69, + 0x1ba3487a9a264cd5, + 0xf9a8371eda297c53, + 0xb7e4952ed52b69af, + 0xa1248391f53e892d, + 0x9e83cda32531c789, + 0xc51ab3276423c7f5, + 0x4ace386a9128e673, + 0x4c81bd576d18e4cf, + 0x457e6d8a9e2c154d, + 0xc1b395dbac1f23b9, + 0x8753bd4fec146327, + 0xe9dc1831fb267193, + 0x7ac58eb328176edf, + 0xc6a89fb4361a8e5d, + 0xd73b8266541e8dc9, + 0x8a63fe7a9521dc37, + 0x4df8a1ca9214eba3, + 0x56db71ca9de6fa21, + 0xe78d49ccbcf8197d, + 0xa9e5fc3edafb27e9, + 0x58f9c6d21bfe3857, + 0xf92157a54af176c3, + 0xe265f3487af59641, + 0x8a4f6c1875f6839d, + 0x9b51f43985f9a31b, + 0xd43f8c9ba3fdc187, + 0x2c5be6aa91cebfd3, + 0x14a3267cbdc3fe51, + 0x85a794d32fc51ead, + 0x3698b7f54ce83d2b, + 0xdbc692154aeb3c97, + 0xe5ab19d768cd5af3, + 0x41f8c72cb9e28a71, + 0xde837f2ba5e387cd, + 0x3e6a7bfed3e6a74b, + 0x495a2e11f2e9c5b7, + 0xb8e7cd4213ecd625, + 0x49827ca652cfe491, + 0xfa519cd76eb413fd, + 0xcb12e6f98ed7326b, + 0x94df2cb98bc941d7, + 0x25ce6fdba9cb6f35, + 0xd18fe64dc7bd6ea1, + 0x3791a5ffe6b28c1f, + 0x9acd2e7215d39c7b, + 0x3f1ab59323c5bae7, + 0xb5e8316542c9da65, + 0x93d8f15762abe8c1, + 0xaefc52376c9de73f, + 0x18b4639baec3269b, + 0x6423facfedc74619, + 0x32bcd581fbca6485, + 0xfb317d9329ab74e1, + 0x28e6a51437ad825f, + 0xef48dc9656a291cb, + 0xa3246b9875a4bf29, + 0x7a35cdb982a6ce95, + 0xdf918e2ba298dcf1, + 0x56ce412a9d7aeb6f, + 0x812f39cfec7f1adb, + 0xa2b634e21ea23b49, + 0x37c6d5932da649b5, + 0xe8cb76d65cba7923, + 0x2af7c895459b768f, + 0x78a614ea947d85fb, + 0x27e6934ed5a1c469, + 0x825b9dafe294c3d5, + 0xb68179e1f1a8e253, + 0x19b7a4543278e1af, + 0xb7e38f665f8c312d, + 0x9e2cf7654c6e2f79, + 0xf169cbd87b824de5, + 0x17cdf65bab957d63, + 0xadf892bdc8576abf, + 0xc386b75fe56b8a3d, + 0x156d73a1f35eb8a9, + 0xd2a576443582d917, + 0xd7ca39865294e783, + 0x51dfb9654176e5df, + 0x64dc1a598f7a165d, + 0xdc5fa4698e6d24c9, + 0xfac3184cbc8f5437, + 0x2fa4395fec8472a3, + 0x9eb4c851fb879321, + 0x3796bd5219478f6d, + 0xd74a3f53254a8ed9, + 0x9bd82537635ebd47, + 0xe421dab98461ecb3, + 0x716f9b5ba275fb31, + 0xc846391cbf461a8d, + 0x6b1d7a4dcd4a28f9, + 0xcd579631fc4d3967, + 0x47fab6c21b4f57d3, + 0x15a8b9f54c639751, + 0x3297cdf7693584ad, + 0x17dba43a9758a42b, + 0x243ec1fba54bc297, + 0xd745b89ba45dc1f3, + 0xa3e5f27dc352ef61, + 0x61735a9dce341fbd, + 0x584e96d21f472e3b, + 0xf8175d654e293da7, + 0x8f5cb6487b3d6c15, + 0x6421a5f87a3f6b81, + 0x6827cd4ba93278ed, + 0xacb1837ed724a85b, + 0xda1386bfe428b6c7, + 0x8e27b1c1f42bd735, + 0xfbd637a3243de5a1, + 0x17e6d5498463251f, + 0x3946fdc98f15237b, + 0x4a1536ea9d1842e7, + 0x724c5f6bad2b7165, + 0xdc42975ba92c6fb1, + 0xa54f679cb81e7d2f, + 0x5ea63c71f6129d8b, + 0xfcbd5e832614abf7, + 0x17524bd43418db75, + 0x729fd587642ae9d1, + 0xc8af45b8721ce84f, + 0xa74128b76def17ab, + 0x4a36c1ecbdf34729, + 0x958cef6edcf74695, + 0x4276e19edae975f1, + 0xcb89d6a219eb836f, + 0x47ec598436fe82db, + 0xca74189767f2c149, + 0x28c14be874e3cfa5, + 0x425871da94f7de13, + 0xa263df4a91d8ec7f, + 0x4591a3298fda1ceb, + 0xc472d59febdf2c59, + 0xf56be4321de24ac5, + 0xd5a638e32ce67a43, + 0xe2846cd43ad8679f, + 0x812b493656eb971d, + 0xd4ae6c9984deb579, + 0x5817926ba6d1c4e5, + 0x8deb491dc2d5e463, + 0x17b6a95ed1c6e2bf, + 0x84f9e6d654ea123d, + 0xfb162a754fcd31a9, + 0xe7af9b154bad3ef5, + 0xcd264a198bc26e73, + 0x51d392c878a46bcf, + 0xf482b7dba6c78b4d, + 0x19f4873fe4dc8ab9, + 0x42c983d1f4beca27, + 0xad8b6e4325c1e893, + 0x7295fa8542a3d6ef, + 0xb234ecd652c8176d, + 0x7529acb76fba25d9, + 0x8d5731ca9ebd3547, + 0x7c82d6aa9caf64b3, + 0x8149fa2febc59431, + 0x6381a2b1f7b5918d, + 0xd39ea86215a68fe9, + 0xbde34653249abe57, + 0xa2c798e6548ebdc3, + 0xf61c934985a2fc41, + 0x94e5df6982a41b9d, + 0x2934df5dcf973a1b, + 0xf68ca5bede9b3a87, + 0xe5924861fb9c58e3, + 0xd843be932caf7861, + 0x574fec243a9285bd, + 0xf9d32ab54896a53b, + 0x45cea8276598c3a7, + 0x6973cb1ba69bd315, + 0x6a74cd8cb49de281, + 0xe24d16bdc49321ed, + 0xe59a8f2ede852f4b, + 0x4d635ae21f863eb7, + 0x961ce2843e8a6d25, + 0x19853cd54b7d6c91, + 0x2e3f8b95485e69fd, + 0xd7541ebdc872a96b, + 0xf4adb93dc564b8d7, + 0xa5468f1fe379d845, + 0x1bdcea61f37ae6b1, + 0x2b4fdec2137ce52f, + 0x4cb375a76391248b, + 0xfd759c476e8543f7, + 0xe8d75f3bae896275, + 0x7aef635a9c6a72d1, + 0x64c2de1ba95b7e3f, + 0xa9d743fdc64f7e9b, + 0xb654de31f763bd19, + 0x7cd483e21764dc85, + 0x6a8e45b43457dae1, + 0xf4d1b2a7624ae95f, + 0x45912a68725e18cb, + 0x2c73514cbf614839, + 0x7a5316bdce6347a5, + 0xb3ca147fed598713, + 0x3a615dbfeb3a847f, + 0x9bc785f2194c83eb, + 0x5c6e89d4384fb259, + 0x14582ac87863d1c5, + 0x28e1d3ca9756df23, + 0xb1d5638a9236ed8f, + 0xc1257deba2491dfb, + 0xc6e59d1cbf3e2d69, + 0xa6213de1fe314bd5, + 0x6c987a521e247b53, + 0x874c9b243c2568af, + 0x4cfb19365b3a982d, + 0xf3c92676572db689, + 0x3f8ad46a972eb6f5, + 0x127dfa8dc842e573, + 0xa3c56d4cb425e3cf, + 0x2ace3b71f259134d, + 0xb2c9f4d6514c32b9, + 0x7bef25976f3e5127, + 0x48ab9e587d216f83, + 0x91e5ac387a136cdf, + 0xad5e217a9a168c5d, + 0x76852fced6178bc9, + 0x638a4bdfe61dcb37, + 0x6a1f795fe51fd9a3, + 0xd7f429a65734f921, + 0x7f9a8ed76425187d, + 0xa4d9b6c8731826e9, + 0xc14f7e298efb3657, + 0xbdf4c2e98bfd65c3, + 0xdc96f27babef8541, + 0x9e4f72ddcaf3829d, + 0x2978561fe8f6a21b, + 0x4c76ad5215e8bf67, + 0x746ead8325f9bed3, + 0xd15fe98764fced51, + 0x3c91a4f874f21cad, + 0xf3ec421a91f53c2b, + 0x9b8d4c6bafe63b97, + 0x419ca53cbcda59f3, + 0x8b75ed61fbed6971, + 0x6a37928219bf76cd, + 0xd7f4be2439e2a64b, + 0xe5d1f7c438e5c4b7, + 0x5cb9a47987e9d425, + 0x254bfae985dbe391, + 0x71d5fbe983abe1fd, + 0x49c8f3bed4e2316b, + 0x257a36cedeb43fc7, + 0x8f54a7321fc86e35, + 0xe74f91243ec96da1, + 0x7965c8a549ac7b1f, + 0x7eb231f546cf8a7b, + 0x9f32c4e986c2b9e7, + 0x5f7c893cb7c4d965, + 0x268c59eed4b8e7c1, + 0x8b5e647ed2bae63f, + 0x865b9f7323ce159b, + 0x481d352873d24519, + 0xa9ec85387fc46385, + 0x5e84f1b76db873e1, + 0x8bcde1387cba815f, + 0xfd178e2a968c7fab, + 0xb23d147dc68fae29, + 0x2ed17a31f6a2cd95, + 0xec18f6932695dbf1, + 0x94bd1a732397ea6f, + 0x68cd94f6538a19db, + 0x9cd241a871be2a49, + 0xadb61cfa9fa148b5, + 0x9d7bf12dceb57823, + 0x467c3fbedca6758f, + 0x2fa7913fea7984fb, + 0xc9de75421a8db369, + 0xe7bf1a24378fb2d5, + 0x1643cf8878a4e153, + 0xa79c35e76374de9f, + 0xe15cb34ba4982f1d, + 0x18eda9fdc18b2e79, + 0xc5bd316baf7d3ce5, + 0x2dec3861fe917c63, + 0x7bda8c421d7369bf, + 0xa73bd9e32c76893d, + 0x12a94fe43c58b7a9, + 0xfa317496596dc817, + 0xbc4e561ba57fd683, + 0xedc4135ba572e4df, + 0x756d231fe397145d, + 0xca2e1b51f17823c9, + 0xcd2e1b95419c5237, + 0xeb293d754f7e61a3, + 0xedc7a1554b516def, + 0x93ed54187b538e6d, + 0x91df65287a458cd9, + 0xfc567a8ed859bc47, + 0xc13849ffe65cdab3, + 0xf6b1a35ed56fea31, + 0xfabe47632563198d, + 0x96218cf5436527f9, + 0x2fb685da915a3867, + 0xd739eb698f4b56d3, + 0x12c6847bad4e8651, + 0x5a2f1d7cbc5183ad, + 0x6b4a759fec65a32b, + 0xed37a851fa46c197, + 0x764825f21748bfe3, + 0xe462a174374bde61, + 0x7e8d3426543efcbd, + 0x36d5bf2a95642d3b, + 0x6c4e293cb1453ca7, + 0xd73f5bedcf396b15, + 0x51f6c38ede3c6a81, + 0x2b4951c1fa2c67ed, + 0xb84fec632d31a75b, + 0xd13e67854a23b5c7, + 0x6e95d1f87a28d635, + 0x3b7c56d98739e4a1, + 0xb4e852aa964be31f, + 0x72b3f41dc54f127b, + 0x96348faed25341e7, + 0x2671cf8ede176f45, + 0xbdc256943f286eb1, + 0xb8ef3ac54d1a7c2f, + 0xc521a6854a1e7c8b, + 0x398a74c76921baf7, + 0x4ad2c1fcb913da75, + 0x149efdccb726e8d1, + 0xeab5983dc519e74f, + 0x85214371f42d16ab, + 0x651c7295451f3629, + 0x3f51ce7983126495, + 0x4cbd2ef76de574f1, + 0xb21cf7e65ce7826f, + 0x1db57e976af981db, + 0xa93fe15987ecaf39, + 0xbe576d1a96dfbea5, + 0x61db7e4dc7f4ed13, + 0x7c65dea215d4eb7f, + 0x712b9e6434f71aeb, + 0x4ed8f12763fc2b59, + 0xbe9f361871fe39c5, + 0x9c8eb3fbafe17943, + 0x53db8e6bacd3769f, + 0x958d671dcbe7961d, + 0x4d9ce671f8eab479, + 0xf87cdbe218dcb3e5, + 0x8ea362c548cfd263, + 0x8613fbd656c3e1bf, + 0x34c6e1aa96e7213d, + 0xe57463dba3d72f89, + 0xc617a85a91ca3df5, + 0xbe81d93bafbe5d73, + 0x4365fa7fedb16acf, + 0xa5fb8dc21ec38a4d, + 0xa3cd1f832cd5a8b9, + 0x9816c53548dac927, + 0xa628743656bcd793, + 0x3a9efdc8749dc5ef, + 0x1784adccb7c3156d, + 0x1697df3fe3c624d9, + 0x75642e31f1da5347, + 0xdac8bef541dc62b3, + 0x71f9a3e65fbe8231, + 0xea5b18654ca18f7d, + 0x3b268de65ba38de9, + 0x5234ac6989a6bd57, + 0xd79b458ba698dbc3, + 0x153427fed69ceb41, + 0x584f23adc37ef89d, + 0xefa639c326c4391b, + 0xcde8532542c53987, + 0x2c5df19761b957e3, + 0x167df4865fac8761, + 0x7c5e3d976c8e74bd, + 0xbd96784dcd91a43b, + 0x36db97afeb94c2a7, + 0x758dce61f9a8d215, + 0x4e9bfa532689df71, + 0x9e5c38132469fecd, + 0x2418d9a7658f1e4b, + 0x26aedc7984923db7, + 0xd8f3ae1cb1a76c25, + 0x28d579fdcf786b91, + 0xfa14ed8cbc5a68fd, + 0xbc3685e1fc5e986b, + 0x8416ec932c81b6d7, + 0x984cfb332b93d745, + 0x17f8ac654987e5b1, + 0xb2c6f9598679e42f, + 0x17b24e6ba57d138b, + 0x6d9ce2fcb48e32f7, + 0x3c752a1fe2a36175, + 0xf2619bcede756fc1, + 0xe3f4bc521e587d3f, + 0xbd489f132e4a7d9b, + 0x721df5c54b5eac19, + 0x42d65f987a61db85, + 0xfc1ed56ba864d9e1, + 0x6ac7125cb746e85f, + 0x81b9f6dfe45917cb, + 0x986db4c1f46d2739, + 0xce9b32f2127f36a5, + 0xdeb69f8872948613, + 0xe31485d76e45837f, + 0x12ebdc476d4782eb, + 0x375d49f98d4cb159, + 0x3de8457a983dafb5, + 0x375d128dc961de23, + 0x8f971b4ed643ec8f, + 0x14b3dc6327461cfb, + 0x4c1bf7d4354a2c69, + 0xd46b18c8724c3ad5, + 0x715dc8ba914f6a53, + 0x857bcd2a9e3267af, + 0x58c3eadcbe35972d, + 0x739d48afed27b589, + 0xcf15a49fe92ab4f5, + 0x475c26a21a2ed473, + 0x8eb649f65841e2cf, + 0xa4d27fb98956124d, + 0xc9d37b8ba64731b9, + 0xad75219cb53a4f17, + 0x4ef67a8cb12c5e83, + 0xe18426da9c1e5bdf, + 0xe27a94b1fe128b5d, + 0xe63a94732e148ac9, + 0xbc5fe2154d18ca37, + 0xace6f216591bd8a3, + 0xb25e1c68793de821, + 0xec3f24acb932167d, + 0x4823a6bdc71425e9, + 0x89b34a6fe6193457, + 0x64d3be21f21a64c3, + 0x4a593727652d8341, + 0x6fac21943cfe719d, + 0x8d1fb3554bd18ef9, + 0xf2ac3b665af3be67, + 0xdc92afb878f6bcd3, + 0x9f1e852ba7f9ec51, + 0xb179c46984ebf9ad, + 0xaf38562ed5ef1a2b, + 0x95a6287215f23a97, + 0x5de6fbc542e658f3, + 0xbc2a84e652fa6871, + 0xa2d591b54fea75cd, + 0xb25fe9d87cde954b, + 0x5423b18a9ae1c3b7, + 0x18f7e26dcae6d325, + 0x6357dba1f8d7e291, + 0x92f8dc5215a7cfed, + 0x42859f1436dc1f5b, + 0x348bfc2654bf2ec7, + 0x57e8124a94e26d35, + 0xfe4c5b3a92e56ca1, + 0x2f76de5a9ec87a1f, + 0x8b7c5efbaedc897b, + 0x9b14a281f9bda8e7, + 0xb3598d432bc1d865, + 0xc76415d439b4e6c1, + 0xc192f3e548b7e53f, + 0x84ac215876da149b, + 0x145892bba6cd3419, + 0x781c543cb3cf4285, + 0x12c3b7eed3c472e1, + 0x758fa1bdcda57e4f, + 0x7b5d8a921f967eab, + 0xb965ed743e8bad29, + 0xfe842ca43a8ebc95, + 0x8afc47b76892daf1, + 0xf96531d987a3e96f, + 0x8b216a7dc5a618db, + 0x6c97dbafe5cb2849, + 0x36718d21f2ad37b5, + 0x6359aec214bf6723, + 0x23f98e7651b2748f, + 0x6fd39b554e9583fb, + 0x4eb376a65ea8b269, + 0xf4a621987c8ab1d5, + 0x8e75196ba98dcf43, + 0xdea6c83cb671ed9f, + 0xebd9c251f7952e1d, + 0x53afb4d215a62d79, + 0x7e56f38324893be5, + 0x6ac93858729d5b63, + 0x5937cb87617e58bf, + 0xb653e17baf72983d, + 0x483729adce74b6a9, + 0x5c964a7fed89c617, + 0x41d6bc51fa7bd583, + 0x4f926752186bc3df, + 0x345829f76a92135d, + 0x895bf2d7678532c9, + 0x9d485a7cb6a95137, + 0xc57ea8fcb27a5f93, + 0xbd61c38a916a5cef, + 0x376ef19bae4f7c6d, + 0x3954ba71fe528bd9, + 0x784cf5d21e65cb47, + 0xf176de932c57d9b3, + 0xe4fab7c65a6be931, + 0x182b93a6574cf68d, + 0xa7cef23cb87126f9, + 0x2a41567ed8943567, + 0x42b9a8cfe27865d3, + 0x382d9751f27b8451, + 0x1d824b54315c72ad, + 0xf2b86e554e5f912b, + 0x6a2bfed65d42bf87, + 0x2f369ed87a45bde3, + 0x8bc3e2da9a48ed61, + 0x76b52ada9638fabd, + 0xbc4f579ed75e1c3b, + 0xbc1248d1f6513ba7, + 0xcd45837328746a15, + 0x6e38c74653476981, + 0x8f673eb6513976ed, + 0xc4d926e87f2d965b, + 0x3abef5198d2fa4c7, + 0xc18a243cbc62d435, + 0x35c1e7fedb46e3a1, + 0x97536fced948e21f, + 0x1f7d59c4394c217b, + 0x6e97a285463c2fd7, + 0x4cbf126a98316e45, + 0xea1b42ca95346db1, + 0x83fe9cbba1367b2f, + 0xb95d463dcf197a8b, + 0x5da94c6cbd1ca9f7, + 0xd1a8b32feb1fc975, + 0xeb9257154b23e7d1, + 0xa9c2b4143a15e64f, + 0xe3f5dc17692815ab, + 0x4fdec16ba81c3529, + 0x5316cafcb71e4395, + 0x4239d16dc64273f1, + 0xf3a24c7ed324816f, + 0x4dc8593bade47fcb, + 0xfed5a2321df7ae39, + 0xfd3584b32cf9bda5, + 0x8326ba4659fedc13, + 0xd2bf139658d1ea7f, + 0x2754ca9987f419eb, + 0xe387ba9dc6f72a59, + 0xf275e6bed4fa38c5, + 0x129bc6afe2fd6843, + 0xe548ab7212de659f, + 0xc72e354762f3951d, + 0xd367b8254fe5b379, + 0xf8e159d76cd8b2e5, + 0x9a5421798aebd163, + 0xae16f398769bceaf, + 0xdf2785ccb8c31f2d, + 0x6e2c1a91f6d42e89, + 0xa9326e4216d73cf5, + 0xb45f1cd324ea5c73, + 0x391bcea542db59cf, + 0x34cf2d9761cf794d, + 0x829ad5c76fd2a7b9, + 0x397bf82baed5c827, + 0xf37dc1afebc8d693, + 0x527fca8ed7a9c4ef, + 0x75364be218acf36d, + 0x4978d2a658c123d9, + 0x7fc5e43989d65247, + 0xa85bfc2a95d861b3, + 0x451f863a94ca7f21, + 0xe8c75b4a91ab6e7d, + 0x93bf815bad8f7ce9, + 0x7dae4351fea2bc57, + 0x596fbe221e95dac3, + 0xc29ed7b43cb8ea41, + 0x9abd4164368af79d, + 0xa1befd3767ae281b, + 0xa5f821dcb9c13687, + 0x4d7f591dc7b456e3, + 0x27a1c5dfe3c98561, + 0x84573921f1a973bd, + 0x62d1fac541ad923b, + 0x5297bc143e8fb1a7, + 0xdcf832665c82bef3, + 0x5d3c94a76b95de71, + 0x9c62e1465876fbcd, + 0x2f5ae84dc78a1d4b, + 0xb7e8124ed58e2cb7, + 0x9d64c211f7a16b25, + 0x1a46d3f325b46a91, + 0x61b8dcf4329567fd, + 0x298ab355418a976b, + 0xc1f35be54f6ca5d7, + 0x7bd326ca9d8fc645, + 0x72c3f1dbac83e4b1, + 0x1ed8526dca86e32f, + 0x62c53e11fa79128b, + 0xdb4183c3298b31f7, + 0xcf9a61d3278d3f65, + 0xe298c54875826ec1, + 0x6148fada92847c3f, + 0x81db52eba1657c9b, + 0xa5e8136dcf58ab19, + 0x8daf465cbe4dca85, + 0x29ce47beda5fc8e1, + 0xa697cde21b62e75f, + 0xc12694f43a7516cb, + 0x1dc693265b7a2639, + 0x75c8f63a987c34a5, + 0x186cfa9cb68e7513, + 0x576f4addc461827f, + 0x5f6a749ed26481eb, + 0x59ce714ede36af49, + 0xa43d2bc21f38aeb5, + 0xcfd53e154e5bcd23, + 0xb7296a55493edb8f, + 0x2fe8a14879531afb, + 0x468f3abdca452b69, + 0x34d2a17dc74839d5, + 0xd1a2f57fe74c6953, + 0x5f73164fe23d56af, + 0x956a8fb43451962d, + 0xc9243df76153b489, + 0x38f4eb776e27b3f5, + 0x4c17b2598e4ad273, + 0xfa18e4d8793ad1cf, + 0xca6425fa982cef3d, + 0x81cbe97ed8432fa9, + 0x28bde511f9364e17, + 0x53e8acd217295d83, + 0x1759a64434295adf, + 0xd137a827632e7a5d, + 0x9af34e187231a8c9, + 0x1e327cfbaf14c937, + 0xde7ca24cbe16d7a3, + 0x6438ef5edc3ae721, + 0x5c3b17ffe91bf47d, + 0x9e25f8d43a2f14e9, + 0xbec63d498b124357, + 0x46ad9eb9891762c3, + 0xc68325dcb73a8241, + 0xc7d1382a931a6f8d, + 0x4c15d9eba21c7df9, + 0x3b8d26ca9cefad67, + 0xf724561feaf2cbd3, + 0xb1d5c9a32cf6eb51, + 0x1563a98329e6f8ad, + 0x3d291f8658fc192b, + 0x4a98172656fe2897, + 0x5d63bf4ba8e157f3, + 0xdfab591dc5f48671, + 0x8da29f7cb2f674cd, + 0xc51b348fe1fa934b, + 0x82a46fd431fda2b7, + 0xba2ced554edfc125, + 0xe3867c165bc3df81, + 0x976ab1c658a4fced, + 0x21be845879d81e5b, + 0x253876ca96ea2dc7, + 0x321ec84cb7de4c35, + 0xcab61721f5e26ba1, + 0xcb4f965325d4791f, + 0x8596d7b432e5987b, + 0xf98e216541d9a6e7, + 0x29e68bf54fbdc765, + 0xae3bc5487bafd5c1, + 0xcb7ad43a9ab2e43f, + 0xf2d8b5cfead6139b, + 0x72be4c61f8da4319, + 0x617abcd329dc4185, + 0xd25cf64436ac5fd1, + 0x392d51e765b17d4f, + 0x7ca5e19762c37dab, + 0x64eb159981d6ac29, + 0xb895ed387fa8cb95, + 0xf328ce6bad8bc9f1, + 0xfd13582dca9ed86f, + 0x5e6c87a32ca317db, + 0xf7dc62843bc62749, + 0x358b6ca548c936b5, + 0xe24f13aa98bc7623, + 0xa7356cda94ad638f, + 0x84253abdc4a182fb, + 0xfb65ca1fe2c4b169, + 0x61ecabfede86afc5, + 0xe976b5d21f89ce43, + 0xcd8fb7932b6adc9f, + 0xb7682155497efb1d, + 0x2ca4db876ba32c79, + 0x28af941cb8963ae5, + 0xef467cbed7b95a63, + 0xa67e541ed38a57bf, + 0xd68c75e1f29e873d, + 0x6e8cb4f32381b5a9, + 0xf8ae941762a4c517, + 0xa4e876d65f97d483, + 0x26e78a365b68c2df, + 0x4afec9298a7bf15d, + 0xf8369decba7f21c9, + 0xbc58e6aeda934f27, + 0xeab63241f7865e93, + 0x8d34e72214675bef, + 0x76d983f3235a7b6d, + 0xba6d3185425e7ad9, + 0xb64581ca9281ca47, + 0x25ea63fa9f64d8b3, + 0x9e3c85dcbd67e831, + 0x2735fa9dcb49f58d, + 0x189d65ffea6c15f9, + 0xec287bf21b8f2467, + 0x468dbfe65a8264d3, + 0xe47c1fb76a978351, + 0x5fb768aa945871ad, + 0x86dcf54a935a8f1b, + 0x12458f6cb14dae87, + 0x362bf4cbaf51bce3, + 0xc7235ed1fd54ec61, + 0x57e84ba21c35f9bd, + 0xfa8c61b54d591a3b, + 0x79a832f65b4d29a7, + 0xdb1a26998a6f4915, + 0x3769db2dca536781, + 0x928d57acb63475ed, + 0xdab97f4fe238945b, + 0x76c8bea1f14ba3c7, + 0xf53ba7c5416ec235, + 0x2c7b5d176f53e2a1, + 0x146ec7b65a23cefd, + 0xba6134998c371f6b, + 0x4ca9d7b98a392ed7, + 0x37fed98cb92c3d45, + 0xa7fc361ed73f5cb1, + 0x527ca83fe6437a2f, + 0xfb36e8a21524798b, + 0x2a769f154326a8f7, + 0x13a5ce77612bc875, + 0xc51b93687f2ec6d1, + 0xc285a61a9c21e54f, + 0xbd286fadcd2514ab, + 0x3af2154fec183429, + 0x2ca4d751fa1b4295, + 0xbcd13e85493c62f1, + 0xf186cb94371d6e5f, + 0xae573c4765127ecb, + 0xc4def6298415ad39, + 0xca8472ea9217bca5, + 0x914d6c298ef9db13, + 0xfdc521798aebd97f, + 0x4e7251bba8cdf7eb, + 0xb953a8421cf32859, + 0x5be976832af637c5, + 0x2bf43dc659fa6743, + 0x32568ea875eb649f, + 0xa1458bea95fe841d, + 0xb467a93dc4f1b279, + 0x38f415bdc2f4b1e5, + 0x5f764dccbed7cf53, + 0x9de8c7a21eb7cdaf, + 0xce467df439bafc2d, + 0xfc9213d54acf1d89, + 0x1afec42879d23bf5, + 0x3c9465bba9e65b73, + 0xb3f4e92ba4d758cf, + 0xade87b4dc3eb784d, + 0x14796281f2de86b9, + 0xf681cd7434e1c627, + 0x5be84c7761e4d593, + 0x5a9176e54da6c3ef, + 0x2d9e6bf65cb9f26d, + 0x56238ba87abc12d9, + 0xd658a12cbacf3147, + 0x8ec927fed8c25fa3, + 0x6e598b31f8c67e21, + 0xd6fc72b214b86c7d, + 0xfa3cd59323ca7be9, + 0x12a83be542ceab57, + 0x94abf1c872b1d9c3, + 0x6db241c98fb5e941, + 0xf17ba6398ca5f69d, + 0xc79f531fedca271b, + 0x19a6d341fabd2587, + 0x26b48f5219af45e3, + 0xce7134f65ac38461, + 0xc3df568546a572bd, + 0x649c3a1875c8913b, + 0x2e148fc7628baf97, + 0x78ca1eba918cadf3, + 0x3a249f5cbf92ed71, + 0x2d96c58feb73facd, + 0x45ebcf832e971c4b, + 0x2154e9a43d892ab7, + 0xe4185a776b9d4a25, + 0xed1bac8767af5891, + 0x9cb7582ba59276fd, + 0x2a418cbed3a4956b, + 0x369a425fe298a4d7, + 0x1db92651f19bc345, + 0x65ec9125428ed3b1, + 0x7d9ba4865d83e12f, + 0x3bd4c7f76e95218b, + 0xadc893f65b862fe7, + 0x6324e17a9b8a3e65, + 0xc7fde6bba87b5dc1, + 0x92d53b1dc57e6b3f, + 0x53c6d121f4627a9b, + 0xfeb6a9c32475ba19, + 0x5bc14e843267c985, + 0xe9acd726526ac7e1, + 0x15f83c487e4cd65f, + 0xc8adbf4a9e7215cb, + 0x6d2a9e8dcd862539, + 0x1dfc428fec7843a5, + 0xa498d131fa8b7413, + 0x64758b93295c617f, + 0xdf9184e3254e6fdb, + 0xc162a4987562ae49, + 0xfa17b5d98264adb5, + 0xf75d648ba168dc23, + 0xce4856287e39da8f, + 0x5e3d1baa9a3ce8fb, + 0xe8934511fd512a69, + 0xab8ed4921c6438d5, + 0xd8cf93a32c496853, + 0x1e75c965483965af, + 0xcb75814a974c852d, + 0x4eaf8c6cb54fa389, + 0x8b7596fdc463b2f5, + 0x9814367fe256d173, + 0xd74e5f8bad26cebf, + 0x8be934d21c29fe3d, + 0x8db51e654c3d1ea9, + 0x179be5398c524d17, + 0x3a2b86ca9b245c83, + 0x2def846ba82659df, + 0x9b748dfdc62a795d, + 0xd743f18fe42d87c9, + 0x5483a2cfe42fb837, + 0xcb98d6a21542d6a3, + 0xd3641b798347e621, + 0x3adebc965e18f37d, + 0xc6158b987d2b13e9, + 0xc6384e9bac1e3257, + 0xf23bc49edb4261c3, + 0xe816fcaeda257f31, + 0xbe4c51a1f7156e8d, + 0x683e4d9325187cf9, + 0x789ac2f4341dac67, + 0x97af85c7641fbad3, + 0x5ac2463a9423ea51, + 0xe573a4f76ce3f7ad, + 0x37e41b8badf7182b, + 0x91cef32edcfb2697, + 0xcea65fbed9ec46f3, + 0x8df9bc532aef6571, + 0xc53b176548f273cd, + 0x9eb4d6a657f6924b, + 0x14985cd764f8a1b7, + 0x3492615983eabf15, + 0x65b8421a92fdce81, + 0x396c21e98ca1fbed, + 0x4c36d791fce41d5b, + 0x85e4f7d21de62bc7, + 0xf9e4b3832cea4b35, + 0x52ea7c6548ed59a1, + 0x1cb83ef657ce681f, + 0xc81e46dba5e2967b, + 0x25461f8cb3d4a5e7, + 0x19fb536ed2e9c465, + 0x794a2b11f2ead4c1, + 0xeba3652541bcd23f, + 0x63edb4765fd3129b, + 0x642dcea87ed64219, + 0x859c73a76bc83f75, + 0x359abfe878b95ed1, + 0x73f584aa97ab6c4f, + 0x6a43591ed49f6cab, + 0x85bc7ae1f5d3ab29, + 0x6d93c85213d4ca95, + 0x3c5a6e1543b7c8f1, + 0x8c7db9e541bad76f, + 0x2eb91da54e8cf5db, + 0x8d467e3baec12649, + 0x7c92db1badc634b5, + 0x452b7c8febc97523, + 0x1b847d5fe7ba628f, + 0xd98fc3a3269c71fb, + 0x536ecd1324ae8f59, + 0xa5d4e8976492aec5, + 0xb12d94a982a6cd43, + 0xc358e4a87186db9f, + 0x2b13c7a98e79fa1d, + 0xa5748d1dcd8e1b79, + 0x4c3a56e1fca139e5, + 0xb6de5c721db45963, + 0xd49fa5132a9756bf, + 0xfc5e37a5479a863d, + 0xc35eb947657d84a9, + 0x3d987cbba59fb417, + 0x2d95634dc5a4d283, + 0xe9243dccb285c1df, + 0x583c6d4cbc67ef4d, + 0xfa97ed632e6a1fb9, + 0x915dafc54c8d3e27, + 0xc12bd7e76c815d93, + 0x13def54769735aef, + 0x6295dc8cb9857a6d, + 0x942be68dc45a78d9, + 0xb76a543fe36db947, + 0xa8396f2fe26fc7b3, + 0xc81be3d32594e731, + 0xdf8649e43175f48d, + 0x1c832a965e6814f9, + 0xd687425a9e8c2367, + 0xd63e128a9b7e52d3, + 0x46e29cbedc938251, + 0x3da8146dc8536f9d, + 0x487de6c1f7568e1b, + 0xdfb957421549ad87, + 0x64e813a3245cabe3, + 0x1d8ef468735fdb61, + 0x54f983287152f8bd, + 0x196452cbaf56193b, + 0x948fed7dce4928a7, + 0x94f3687fed6c4815, + 0x731cb541fb4e5681, + 0x6b5a14d32a5174ed, + 0x1d38f9432a64935b, + 0x3d876fb65846a2c7, + 0xf4d6bc3a976ac135, + 0xbd543a69834bcf91, + 0x2d751e49813ebcfd, + 0xa4f6e13dcf431e6b, + 0xe4c86d71fe352cd7, + 0xe2fdba421e293c45, + 0xa836ce554d3c5ab1, + 0x9e8ab3765a3d692f, + 0x89a7f5b76a31978b, + 0xe38f714cb823a6f7, + 0x49826a7ed428c675, + 0xf79db63fe439c5d1, + 0xf376984fe12bd34f, + 0x97c81525413ef2ab, + 0xf926b8a87f154329, + 0x3e7da1c98e274195, + 0x498da6c87b285fe1, + 0xc1f6a3b9891a6d5f, + 0x48bfae2a971e6dcb, + 0x28cf649fe721ac39, + 0xb5ed4911f613cba5, + 0xc35168954627da13, + 0xf3ce2d554319d87f, + 0xe2134c86521af6eb, + 0xc17eaf476dfe1759, + 0x43f8ea6a9df136c5, + 0xc284a35cbcf57643, + 0x78e5f4ddcae7639f, + 0x5c6b184fe7fa831d, + 0x6475bfe326fda179, + 0x7c8eab5324ce9fd5, + 0x2b543fd876f2ce53, + 0x83f714b762e4dcaf, + 0x3d9cae6981e7fb2d, + 0x53cfad887feb1c89, + 0xcd1a674a9bcd2af5, + 0x2a8b9741fce15a73, + 0x4a23d5921ad357cf, + 0x1a9bc4332ae6874d, + 0xba947e8436ea85b9, + 0xd179c4a986edb527, + 0xfb75a14985dfc493, + 0x17eda48a94b3c2ef, + 0x193564dcb2c5f16d, + 0x1a8dfcbfefc821d9, + 0x598cd7621ecb2f37, + 0xc178aef32cbd4ea3, + 0x29478b176bc37d21, + 0x8d7af13659c36b7d, + 0x5e62b4f986c57ae9, + 0x7f286badc4d9ba57, + 0x47f8ab2fe4adb8c3, + 0x9bf4618fe3bfd841, + 0x3ea57f6213b2f59d, + 0x6491efc653d7261b, + 0x196ca4b65fca2487, + 0x96ae35f87dab54e3, + 0x7bac38ea9cbe7361, + 0x2d81b54dc9a271bd, + 0xc8f95a4ed7a48f2b, + 0x2c56b181f4b5ae97, + 0x7e5693a21598acf3, + 0xe12a6fc4349bdc71, + 0xeb62af95427fe9cd, + 0x75e9a6d982c31a4b, + 0x3afc21498fa529b7, + 0x4627ad5dceba4925, + 0x9cd54b6fedac5791, + 0x352b97ffe98c65fd, + 0x8c5be9732ca1946b, + 0x7f1bd8532894a3d7, + 0xce754d9767a8c245, + 0x19283ea87589d2b1, + 0xb651a7d9837ace1f, + 0x3d75842a916dfe7b, + 0x9f4cd8acbf832de7, + 0xb4c1e531fe973d65, + 0xdfb34ea32e785bc1, + 0xfa1b45632c7b6a3f, + 0x8ec476143a5e689b, + 0x48b21ea76a72b819, + 0x3e91a4fcb693c785, + 0xe4523a7cb487c6e1, + 0xbda5194dc279d45f, + 0xcb7f184fe16af3cb, + 0x23a796c6528f1439, + 0x493287f76f8342a5, + 0xa7fdb9876e987213, + 0xba86dc987b485e6f, + 0x9db284e878496edb, + 0x7ce41d5cb75e8d49, + 0xdf5c791fe761acb5, + 0x2396a571f675db23, + 0xe48bfda21345d98f, + 0xefd8ba643248e7fb, + 0x2e1d3a88725d1869, + 0xe31f27598e4f27d5, + 0x358ec74cbe826753, + 0xdaf5264cbc3564af, + 0x297d3c8feb59842d, + 0x51d2ec61f74ca289, + 0xc4ed7383284da1f5, + 0xbe3ad6254851cf63, + 0xb49c12876543cdbf, + 0xcd4eba398246fc3d, + 0xed16547cb2481da9, + 0x25b3f41baf4d3c17, + 0x691fd24dcd2f4b83, + 0x2a4b958feb3258df, + 0x5ec789a21c24785d, + 0x89d7b6243b2786c9, + 0x18a9ce36592cb637, + 0xce5a4f19872ec5a3, + 0x57462cfcb863e521, + 0xa1e7f35cb534f27d, + 0xcb67a93ed34712e9, + 0x14fd627fef2b3157, + 0xbdae76f32e1c4fb3, + 0x8c392b665c2f6e31, + 0x8ac9d6465b126c8d, + 0x79d5ca276a147bf9, + 0x3a5698fdc918ab67, + 0x4fadb53dc61ab9d3, + 0x1267fdbdc62ed951, + 0x592a3fbfe421f6ad, + 0x7fea63954635172b, + 0x8791ca3763182597, + 0xc3b1d7476de945f3, + 0x75e943698dfc6471, + 0xfe94582879fe62cd, + 0xe39f671dcaf2914b, + 0x3782dbadc6e39fa7, + 0x18274c6ed6f7be15, + 0x4bdf359325f9cd81, + 0x7c98f6b323f9caed, + 0xe3ab916542defa5b, + 0xe3c546f981f32ac7, + 0xcd75361a9fe74a35, + 0x37524afcbde958a1, + 0x2bf6913dcadb671f, + 0xd8e4c361f9de857b, + 0xafc671b329d1a4e7, + 0x5d43c6f329e4c365, + 0xfd81c26656e7d3c1, + 0xfc1859a875c9d13f, + 0xd125ec8762caef8b, + 0x641e8a5a92bd1ef7, + 0x6f3215ccbfc23e75, + 0x395e48a1feb65cd1, + 0x76ed2ca21dc86b4f, + 0xb3c81d9328dc69ab, + 0xf56b813547ce8a29, + 0x2b8c4ed767d1c895, + 0x14fe628a96b4c7f1, + 0xe364b28ba3b7d56f, + 0xa58b312dc2a8f4db, + 0x894d5eb1f2cd1549, + 0xefa8d2c541cf23b5, + 0x24b1c3d76fc57423, + 0xabc793254db5618f, + 0x29b7c8d54a976feb, + 0x8dfa5c2767ab8e59, + 0x6e28bf7ba68e9dc5, + 0xfdacb63fe7a1dc43, + 0x71a2465fe483da9f, + 0x86ebd14324a6f91d, + 0x83a29cd543cb1a79, + 0xbacde28761ac28e5, + 0xc635a1b87eaf4863, + 0xfb96c4598d9265bf, + 0xd87fe56cbca6853d, + 0xc3472f6fecb783a9, + 0x8e2cd531f89cb317, + 0xd46b3ea3279ec183, + 0x2d46a9f43571becf, + 0x2b79cef76583fe4d, + 0xa5c6b2d873861eb9, + 0x541d7f2cb19a3d27, + 0x5b1cd39baf7d4c93, + 0x8b137c2bab6d49ef, + 0xd2e7b411fc82796d, + 0x48be75321c6487d9, + 0x98e41b632c69b847, + 0x953ec6b5487ac6b3, + 0xe275d1ba978ed631, + 0x46925d8ba571f38d, + 0x94fda82dc48513f9, + 0x8d927f6fe1a93267, + 0xac96b3dfef7a51d3, + 0x69d1fac32e7c6f41, + 0x5cb697832b4f5e9d, + 0xeb9f21465c638d1b, + 0x2c95fd776b54ac87, + 0xb14c267a9857bae3, + 0x574af83dc75bda61, + 0x3d16245ba34ce7bd, + 0x41c6d9a1f572183b, + 0x74bd53a2138426a7, + 0xb35f78a762894715, + 0xbed6ca187f4b6581, + 0x1963d5287c4b63ed, + 0xcea6f34a9c4f825b, + 0x5162e78edb53a1c7, + 0x6387b14ed946bf25, + 0x2b7e6491f647ce91, + 0x9482a5b21538cbfd, + 0x9a3e4cd3243dfc6b, + 0xe46a3d2984512bd7, + 0x938d64bba1763b45, + 0xc4b26e9baf3759b1, + 0x1a39dcecbd3a682f, + 0x3c6275afec2d768b, + 0x326e1b7eda2e95f7, + 0x2a7f48621b32c475, + 0x1d326c765936c4d1, + 0x95b2ec376738d24f, + 0xf31e2bc87539f1ab, + 0x85f623ecb65e3129, + 0x6dbaf57dc2413f85, + 0x95fc8a6cbf245de1, + 0x58ca93dfed176c5f, + 0xaf84d1332e186acb, + 0xf9b273654c1d8b39, + 0xf896a325481fb9a5, + 0xbf312da98a24d913, + 0x3d4b1f2ba814d67f, + 0x24b79d5ba417f5eb, + 0x9ac4b86fe42c1659, + 0x521eabd1f31e24c5, + 0x492ba6f986217543, + 0x586179254de3629f, + 0xd17fa9b65cf6821d, + 0x12a3d7854be78f69, + 0x218357a767fa9ed5, + 0x14e8dfaa97febd53, + 0x8b6d724a95e1dbaf, + 0xdf94ae7dc5e4fa2d, + 0xf7a9cd3324f61b89, + 0xa29bc36543ea29f5, + 0xbdaf358761fd4973, + 0x781c4e965dbe46cf, + 0xab2468da9ce2864d, + 0x67ec532bace584b9, + 0x81cae43edae9b427, + 0xa48b5291f7ebc293, + 0xadc5be8326acb1ef, + 0x451eb7a436b1ef5d, + 0xe7d4951765d41fc9, + 0x6e1cf5aa94d82e37, + 0xdfac524981e94da3, + 0x32f5de4a9fbd6c21, + 0x7d415fea9cbf5a7d, + 0x2a3b9461fbc278e9, + 0x9d752ec21cd4b957, + 0xbcf635a329d8b7c3, + 0x469a2ef658cbd741, + 0x5893271765ace49d, + 0x7f5cb29ba7d3251b, + 0x6478fb3dc4d52387, + 0x579e3b6ed1c852e3, + 0xf73da4bfefcb7261, + 0x42bed7521e8b5fad, + 0x9ab68f443c9f7e2b, + 0x8e3bfd954cb2ad97, + 0xfc4e1b576895abf3, + 0x6bd5c27a96a8db71, + 0xc39761eba479e8cd, + 0x713b5d9dc39df84b, + 0x9a3182e1f4c128b7, + 0xc9a8725213c64825, + 0x7586bd3542c85691, + 0xc21bdf643e8964fd, + 0xd9e4f3b65e9d836b, + 0xb549ae176b8f92d7, + 0xf31e4c6edba3c145, + 0x4e86712ed785cfa1, + 0xc8fb392fe587cd1f, + 0xf6d37ae21469fd7b, + 0xbf8521a4348d1ce7, + 0x3a5fd41984a13c65, + 0x1542a7f982945ac1, + 0xfe1b3d5bae87693f, + 0xb719d3fdce5a679b, + 0x2f4d537fec6da719, + 0x6b31984fea7fb685, + 0x1c8973432a83c5e1, + 0x89f15a332986d35f, + 0xa7bd8f554567f2cb, + 0x36b14cfba68c1239, + 0x7d21568cb48e31a5, + 0x28d6e97cb3825ef1, + 0xf95167ccbe735d6f, + 0x7283cd51fe456cdb, + 0x498eb7c21e5a8c49, + 0x391ecb632c4d9ab5, + 0xd4fa8ce6596fca23, + 0xb81237576952d78f, + 0x7ac1e4ba9754e6fb, + 0x5689c3fed45a1769, + 0x367f8a2fe37b26d5, + 0x16795cd1f18e4653, + 0xb13e2c55427163af, + 0xc5dbe2154f65832d, + 0xf64e19d65e46a189, + 0xd5f721a76b389fe5, + 0xf46acd29894cbe63, + 0x3152de69863eacbf, + 0x2a716dbdc752fb3d, + 0xb81e2651f6451ca9, + 0xad364f8326593b17, + 0x5efb7927625c4a83, + 0xb9d21fa7613c47df, + 0x25e3af4a9f31875d, + 0x8c61fd2bae2385c9, + 0xaf3e4b2dcd28b537, + 0x652b719feb29c4a3, + 0xa57edb21f95cd421, + 0x4ebd8973283fe17d, + 0x85a3cdf7685421e9, + 0x31e4857a98362f47, + 0x27fb836a95284eb3, + 0x41edc67ba24b6d31, + 0x3fe1b7da9f1e5b8d, + 0x42eda38dcd217af9, + 0x2a7cd651fd13ba67, + 0xa8e147632c16b8d3, + 0x7ac5e9354b2ad851, + 0x32b795c5471be5ad, + 0xe352a7f9871ef52b, + 0xf2ae7b5dc8132497, + 0x43576f9dc61754f3, + 0x76b1c38fe42a6371, + 0x8ca6974cbef961cd, + 0xc3a7fd421dec7f3b, + 0x78a53ef32bdf8ea7, + 0x8d94bcf76af3bd15, + 0xa8cf9e2769f5dc81, + 0x1e9d5a4875f6c9ed, + 0xf6714e2984eaf95b, + 0x1a96cf8cb4fe19c7, + 0x89b42c1fe6f14935, + 0x693b7da323f457a1, + 0x6b1fc78542e8761f, + 0x19afc5443fea847b, + 0xe6a8c1265bdc93e7, + 0x1ab9dc798adfb265, + 0xfc6d1b3ba9e4d2c1, + 0xe2f7b36ba7b5ce2f, + 0x8ea65f4ed4c6fe8b, + 0x8ce647f325ca1df7, + 0xbde8572434ce2d75, + 0x1e64d3c874e25bd1, + 0xf6ce4ba981d36a4f, + 0x5a61cef87fd568ab, + 0x6a5fe8c87edba829, + 0x3a6f892feacdb795, + 0xb67a8e5ed8aeb6f1, + 0x5d973c8219b2d46f, + 0x4e5d317327a5f3db, + 0xdfc1a34767da1349, + 0x5f4e976986dc32b5, + 0xc1d8942ba5ce6123, + 0xf519d67ba2b15e7f, + 0x716e28cbaf936deb, + 0xdbe41a61feb68d59, + 0xd6a39b821ea89bc5, + 0x79e64fb32a9dcb43, + 0x5cd24194367ec89f, + 0x3fe8b7a767a3f81d, + 0x4f28ae5cb6c51879, + 0x6fd9b42dc4b927e5, + 0x4b2786dfe2bc4763, + 0x2c5a4dbfe19d54bf, + 0x81723fb652b1843d, + 0x89714c243fb482a9, + 0xdbfa61465ea8b217, + 0xde6b41865c89bf73, + 0x76e9f8265769adcf, + 0x14e23dba967fec4d, + 0x16754affe6831db9, + 0x528ad491f5a63c27, + 0xc953aeb215a84b93, + 0xb97e1a84327a48ef, + 0xbf5c2365419e586d, + 0x236d7e165f7186d9, + 0x36bdc82bae93b647, + 0xf2e953cbad87c5b3, + 0xfbd2c61feb8ad531, + 0x1ea623d1f76be28d, + 0xbfed1c63276de1f9, + 0xb813e7c659a43167, + 0xae2d619875864fc3, + 0x12843bcba3896e41, + 0x1db39f29816a5c9d, + 0xe2b1876a9f5e7c1b, + 0x7bc5a34ede51ab87, + 0x31aecb71fc64b9e3, + 0xcf7693832c57d961, + 0xc8a6f5e32948e6bd, + 0xfc539715485cf63b, + 0x4ed2178a986f15a7, + 0x369f154dc8934615, + 0x835cb96ed3976481, + 0x9b128a4dc15862ed, + 0x58632a4fef4c815b, + 0xc6e7fd421e3d8fb7, + 0x8c215f654d61be25, + 0x418fdc976b54cd91, + 0x412b8c976835cafd, + 0x1b5d842a9738fa6b, + 0x3a2ed57cb64c1ad7, + 0xeb2a53ced76f2a45, + 0x92637db1f46358b1, + 0xe5d67f821345672f, + 0xa1265ec54139758b, + 0xfdb93c665e2b94f7, + 0xa7c4e3198d2eb375, + 0xecd3f28a9b52c3d1, + 0x6835ae9cba35d14f, + 0xf5967d2dc725ef9b, + 0xc549d86fe74a2f19, + 0x2be49a82173c2e85, + 0xf61eb8a6563f4ce1, + 0xd437c19984326b5f, + 0x53dfc679812469cb, + 0x45f87c9cbf178a39, + 0x561b384a9e1cb8a5, + 0xfae6925edb2ec813, + 0xc43967bfea21d57f, + 0x8c316db32913f4eb, + 0x21e75f476b281459, + 0xbe84f298781a23c5, + 0x3164758ba81d6243, + 0x87e3c4dba42e519f, + 0x468ce9dba3126efb, + 0x83751e9cbdf38e69, + 0xb9567fcfebf69cd5, + 0x6bda75221df9bc53, + 0xacb5d7f327ebc9af, + 0xafc5e98547cfe92d, + 0xbd95f8a767f31a89, + 0xe2713dcba7e628f5, + 0xe9a8d72dc5fa4873, + 0x261d3c9cb2ea45cf, + 0xbde5216dc1fe754d, + 0xbf8a791542f183b9, + 0xb659d3754fe5b327, + 0x6cdb31e65de7c193, + 0x519dab7548b7aedf, + 0x4d98ec1767bace5d, + 0xd8521f3875aefdc9, + 0x2d817efdc8e42d37, + 0x4ba89c21f5e64ca3, + 0xf9a1cbe435e96b21, + 0xb2419de432eb597d, + 0x9738fab541cd67e9, + 0xf85abd476fd1b857, + 0xf79d5a498ed4b6c3, + 0xb52df3cbabc8d641, + 0x8725916dc7b8e39d, + 0x8a3b567fe7acf31b, + 0x98d72e1439cf1287, + 0x1847fca768c451e3, + 0xce15769984c76f51, + 0xd82394b762b75ead, + 0x35b6f9a981ca7d2b, + 0x9afeb2576fae8c97, + 0x1a6347edcd91baf3, + 0x1e64cb91fcb4da71, + 0xe38924f21a95e7cd, + 0xb9c5a71328a9f74b, + 0x95e16b8548ad16b7, + 0xf4e3ab7a98bf3725, + 0x36fc875cb7c36591, + 0x96c485fcb2a563fd, + 0x5b362cafe1c9826b, + 0xdfc9b73fef8b91d7, + 0x5de276321e8daf35, + 0xf8e653d54d82cea1, + 0x74ebd6c65a84dc1f, + 0x68af25c54985fc7b, + 0x58c2934ba6891be7, + 0xdbfe297dc79d2b65, + 0x6b7cfe8ed58f49c1, + 0x3d2519cfe4a2683f, + 0x76dae92212a4769b, + 0xe9783cb542b8a619, + 0x81495ea43f7cb485, + 0x3ac895f76c7db4e1, + 0x7613ea8a9b81d25f, + 0x79bd38cba974f1cb, + 0x527986bfeba82139, + 0xcd1f384fe67a2f95, + 0x3c84a1d3267b4df1, + 0x48ecd393237e4c6f, + 0x6743ae1653726adb, + 0xbec48f1ba1758b49, + 0xf152a9698f47a9b5, + 0x1c75d4fbae6bc923, + 0x58c2641cba4dc68f, + 0xe84567fed961e5fb, + 0xf75e6d932c841569, + 0x9fa518b43a7824d5, + 0x68caf3d8798b6453, + 0x41ca3eb9846c52af, + 0xd27e489ba46f712d, + 0xf76d8b4dc1528f79, + 0x758cef4cbf349de5, + 0x7a1593c1fe48bd63, + 0x7354e2b21d38cabf, + 0x718fe643294cea3d, + 0xc35478f76c521ba9, + 0xc7b62a4a9b653a17, + 0xa3f8dbedca574983, + 0x1c6ae7dcb53946df, + 0xc73ba95fe23c765d, + 0x65d284afe13f74c9, + 0x1b27ef365162b437, + 0xbc1367a65f46c2a3, + 0x81da23c87e59d321, + 0xce83b2465a29cf6d, + 0xe7a395d7672bfed9, + 0xd59fe28dca512e47, + 0xab7fd28fe8254db3, + 0xec58dba1f7486c31, + 0x2ef478c214295a8d, + 0x18b7f565432c68f9, + 0x71feb346512fa967, + 0x3d2e61498f12b7d3, + 0x8e1dc47bae26d751, + 0x32abc15a9b17e4ad, + 0x48c52efed91af42b, + 0x36cdeb41fa2e1397, + 0xc5df14b76a4152f3, + 0xd2f1b5698a356271, + 0x53f81be874165fbd, + 0xc37df9e984197e3b, + 0x62c1478a921c8da7, + 0x5fd62b998dfeac15, + 0xd361924bacf2db81, + 0x723695dcb9f3c8ed, + 0x6c3a5f421ae6f85b, + 0xa9e625f439fa18c7, + 0xea54183769fd2835, + 0x6b4c93a987ef46a1, + 0xb386f9dba6e3751f, + 0xa9743fbdc2f5837b, + 0x8172439dc1f892e7, + 0x6249acbedfecb165, + 0x4a9753f32ecdafb1, + 0x6eba82554ab1cd2f, + 0xd913cf2549c3fd8b, + 0xfb4e732659d61cf7, + 0x528b3aea98ea2c75, + 0x5b4fe61a96ec4ad1, + 0xf6d4a2ccb3ce594f, + 0xb9c756d1f3e267ab, + 0x3f76e85213e5a729, + 0xa42c9f8431e8b695, + 0xafb52cd54ecab5f1, + 0x7ec218f65badc36f, + 0x412365e879a1f2db, + 0x61274eadcbd61249, + 0xf19c34bfe9d831b5, + 0x4dcfb57fe7ca5f13, + 0x39b265d215ab4d7f, + 0xcf3ab763239f5ceb, + 0xdfe932a763d28c59, + 0xb165a9d871d49ac5, + 0x15f28ad87fb8ca43, + 0xe31784b76d8ac79f, + 0x314987ecba9ce71d, + 0xa38b76c1fbc21679, + 0x5964aec21ab426e5, + 0x731edbc32ac94563, + 0xe265d98546a953bf, + 0xfa2519b985ac723d, + 0x9e41a56983bf71a9, + 0x26e1f97cb1a29ef5, + 0x9481a23dcf95be73, + 0x9dfa687fed76abcf, + 0xed2a3f621c79eb4d, + 0x1f8e4793286dfab9, + 0xd93ecf876ca13b27, + 0x3ad629b878b54a93, + 0x61b832dba59647ef, + 0x5ed1796dc39a576d, + 0xc3da648fe28c75d9, + 0x4f5a27cfe19fa547, + 0x93fba1c65192c4b3, + 0x43cead765f97d431, + 0xb5738d154c67e18d, + 0x3682fcd54a58dfe9, + 0xd48f217a9a8d1f57, + 0x245e89ccb9814ec3, + 0x684bd72fe8956d41, + 0x5d924b71f3765b9d, + 0xdb3ce5a324697a1b, + 0x27eacb64325d9a87, + 0x93d8ac66516fa8e3, + 0x6fde5b2a9f73d861, + 0x3c5d17298c64e5bd, + 0x2e4d6b9bac68f53b, + 0x243b1a5feb6c14a7, + 0x46c38be1fa8e3415, + 0x7a8513c54b926381, + 0xa76b9f14387461ed, + 0x15a49dc983567f4b, + 0xa71edc8762498eb7, + 0xef418d6a916cad25, + 0x3b12d9f98e4fbc91, + 0x96d8c1fbab42c9fd, + 0xc91642ffec34f96b, + 0xd753e9c32c4819d7, + 0x4fb6e2743b6c2945, + 0x49fcd857695e47b1, + 0xe7c1569ba951762f, + 0xfd769a8dc653748b, + 0x9e4b2d6dc24693f7, + 0xd7125affe14ab275, + 0x14c576bfef4cb2d1, + 0xcad972e21c2dbe3f, + 0x8925baf54c32fe9b, + 0x6182bc587c462e19, + 0xc9d162f87b392d85, + 0xce3d548a983a4be1, + 0x19a53fccb72d4a5f, + 0x3a6f851fe53168cb, + 0xae95b631f524a839, + 0x48e5fa321326b7a5, + 0xc3ed7fa7624ac713, + 0xb4f3dc965e1bc47f, + 0x4d8f97c76a1fd3eb, + 0xfe1a682cbd241359, + 0xa5e1724edb1732c5, + 0x5c182d6feb2a6143, + 0x9feb74ced61a4e8f, + 0xc65e18d3261c5dfb, + 0x68bd3ef545218d69, + 0x25843a6874139bd5, + 0x6e1d538a9217cb53, + 0x14afd3965de6c8af, + 0x1fce29887bfae82d, + 0x61834accbaedf689, + 0x4b68ec3edae127f5, + 0x9e5f4c221bf54673, + 0x5649bef328e754cf, + 0x6c42eba656fa734d, + 0xdba1f73764fd72b9, + 0xf4725eba94efa127, + 0x28be794ba1e2bf83, + 0xb341fe698eb4acdf, + 0xb6c24e11fab7ec5d, + 0xfe852ac21ad8fbc9, + 0x98c3fd654ade1c37, + 0x94c1fbd769e14ba3, + 0xdfbac31989e56a21, + 0xd321685ba4e6587d, + 0x7146cefcb3da76e9, + 0x8235da4dc2eda657, + 0x5bc3d4afe1dfa5c3, + 0x82e35d4762e3d541, + 0x6745b1943fb5e29d, + 0xa2d14e865dc8f21b, + 0x94fceb876bdc2187, + 0x841c92e878ac2fd3, + 0x251c486cb9c26e51, + 0x971385bfe6b35cad, + 0xbc25d831f4d67c2b, + 0xb57edfa213da8b97, + 0xe6f1795542bca9f3, + 0xe7a8d64652bfc971, + 0x83fdbc965f92e6cd, + 0xbf7a14e98da5f64b, + 0x271e839badc915b7, + 0xbfd6927feabc3625, + 0xdeb49181f8be5491, + 0x2d8f9c7438a162fd, + 0x71e2a6f437c4816b, + 0x3af2b9c543a58fc7, + 0x45829b3872b9ae35, + 0x48569fc8728cbda1, + 0xf4e5acb98d7ecb1f, + 0xdb375a2dcd82fa7b, + 0xa29ce151fc951ae7, + 0x528eab321db92a65, + 0xc865ad243a9b48c1, + 0xbc9a5f75489d573f, + 0x9c34bed986a1759b, + 0x64892bfdc6b4a519, + 0xc36152bed2a7b385, + 0x71f39a5ed289b3e1, + 0xe18495aede7bc15f, + 0x64927ed21c5edfab, + 0x6be381965d841f29, + 0xa5963fd54c862e95, + 0x35fd97b76a784cf1, + 0x768d1fba987a4b6f, + 0x473e9d5ba46e59db, + 0x5b324d1fe5718a49, + 0x6e4d5c91f273a8b5, + 0x3e6cd2f21497c823, + 0x825e14a43169c58f, + 0xe59d12743e5ad4fb, + 0x9b64de887c5ef369, + 0x947e8cbbac8423d5, + 0xfe23548edc986253, + 0x39be52ced96851af, + 0x6d47cb5fe75a6f1d, + 0xab5e6f72154d6e79, + 0x97b4c8e434619ce5, + 0xde796a298274bc63, + 0x95c1de887145c9bf, + 0x42856cf87f48e93d, + 0xe15763f98d3cf7a9, + 0x25f6c48edc5f2917, + 0x4d8b7e91fc624783, + 0xf62a9b721a3645df, + 0xa68513e32a39745d, + 0x43b72196564b73c9, + 0x5fdb4a2a965ea237, + 0x4891cf2cb562c1a3, + 0xde4b1c5a9143adef, + 0xd271e34baf25ce6d, + 0xb5d3ca6feb27fcd9, + 0xac9b5e832e3c1d47, + 0xfb936ec65a4f2cb3, + 0x9cab15e98c546b31, + 0x61e592d87a24598d, + 0x935d2c1cb52867f9, + 0xcf9e651ed42ca867, + 0xeb2817fdc42ea6d3, + 0xe854a711f342d651, + 0x6fd123965124e3ad, + 0xf6d8e3165e17f32b, + 0x4c81e7d76e3b1297, + 0x3ab416c98b2c41f3, + 0xa62537ea9a2e4f61, + 0xd673ec2ba8125ebd, + 0x476f23bfe8157d3b, + 0x5c4b9211f4168ca7, + 0x216a49b4362cab15, + 0xb6dc81e6542eca81, + 0x9cf3ea176321c7ed, + 0x45fed8976de2f75b, + 0xc471a36a9df516c7, + 0x6d71e5acbcfa2735, + 0x83b1c65ed9fc45a1, + 0xe5fd8b7dc8ed641f, + 0xfe295d1439f1827b, + 0xcaf714e436f491e7, + 0x1d59b8e763e7af45, + 0x854ea72763f8aeb1, + 0x32d9c5a871eabc2f, + 0x8c791ae76dafec8b, + 0xc6e4f1dbacd31bf7, + 0xca2e5741fce62b75, + 0xc3dbf8432be849d1, + 0x7a1598b329db584f, + 0x14c2a6b437de56ab, + 0xe4d1c27987e1a629, + 0x714f692ba6e3b495, + 0xf2e89cbba3d7b4f1, + 0x928641ccb1d9c26f, + 0x312765ddcf9ae1db, + 0xb2853ae21cadef39, + 0x713f69854dc32fa5, + 0x473ed5276bc75e13, + 0x6c37428659b84c7f, + 0xa9c6f35876c95aeb, + 0x5dfe7b1ba4ce7b59, + 0x9fc54b7fe4d1a9c5, + 0x5d7b9a61f2d5c943, + 0x35927cf212b5c69f, + 0x368297c542b9e61d, + 0x51498d743eacf479, + 0x659bdc887caf14e5, + 0xf682c95badc25463, + 0xb695a41dc9a652bf, + 0x92dc1b4fe8b9713d, + 0xd69b31ffe4ab6f89, + 0xbe743a62149c8df5, + 0x76b21dc545a1bd73, + 0x41cde6365283bacf, + 0x4bce93887196ea4d, + 0x1c746d365e67f8b9, + 0xad8f1c7cbe9d1a27, + 0x6b39e8fedcaf2893, + 0xc5918f6eda9246ef, + 0xbc4da5e21ba4756d, + 0x98fcd15326a874d9, + 0xad47ec66569ca347, + 0xd68ca4e8758ea2b3, + 0xa89ecd7cb6a4d231, + 0xe2936dcba183cf7d, + 0x267d8c9bac65fde9, + 0x9c287ba1fd8a1e57, + 0x3dc245a21e7b2dc3, + 0xafe5c4143b8f5c41, + 0x2fac61b54b725a9d, + 0x3457bae76a85791b, + 0x5a96284dc456a987, + 0xa861debdc46ba7e3, + 0x3a75c8fed38ec761, + 0xe6bc74d1f271e4bd, + 0x8de49b332185f43b, + 0x68cd57954f6813a7, + 0xefbd24687e8b4315, + 0xfe627bda9c7d5281, + 0xd68941b8785e4fcd, + 0x1e79f25dc9627e4b, + 0x9285f1dfe6548db7, + 0x6cda8e71f468ac25, + 0xb7a41d53245acb91, + 0xdcb82af4324cb8fd, + 0x6d9834b87251f86b, + 0xd5847fba9f5418d7, + 0x9d6a327cbe692845, + 0xba52413dcd5a46b1, + 0x65b2a9eeda4c652f, + 0xdab39f1fe94f638b, + 0x3fe86d721a5392f7, + 0x4d28ac943946b175, + 0x87cafed76547afc1, + 0x943abe187249bd3f, + 0xe293a8b8713ced9b, + 0xa7425f8cbf532d19, + 0xb29a73cede342c85, + 0xd4a693e1fc374ae1, + 0xd4cbf3621c2a495f, + 0xda4782e4392d57cb, + 0x28d36c165a2f8739, + 0xb63da12a9832b6a5, + 0x9c6d37ecb847c613, + 0xa18f493cb428c37f, + 0x153df47dc139d2eb, + 0x41a3f78dce2df159, + 0x8b5f7e976f4231c5, + 0xb2f8e1d87d165f23, + 0xd4328c665b164d8f, + 0xdb15c82769185cfb, + 0x9723146ba81d7c69, + 0x698c5a7cb61f8ad5, + 0x56b2df3fe712ca53, + 0x42d183bfe314c7af, + 0xf52abd843418e72d, + 0xa1783ef5421bf589, + 0x8c2a6b354dec16f5, + 0x3f769db98cef2573, + 0x9f25d1498ae253cf, + 0x6c5fd87cbaf6724d, + 0x243af8ced6f871b9, + 0xe3b145ced5eb9f17, + 0xd694b2a215fdae83, + 0x6cb2598434e1abdf, + 0x84bdcea762f3eb5d, + 0x5dce7f1761e5fac9, + 0xd29475a98fea1b37, + 0x4dfb93c98ced29a3, + 0xa1b26d9dcbdf5921, + 0x7c93a8e1fae2567d, + 0x5ad963f21ad475e9, + 0x97ac863328e9a457, + 0xa8d7196656eba4c3, + 0xed65937986dec341, + 0xb4379a6984c2e19d, + 0x9f3ce61981b3def9, + 0x2371564cbec81f67, + 0x73b429a1fcb92ed3, + 0x3c4ea1932ebc4d51, + 0xb46d9a33289f4bad, + 0x974cb6f659d37a2b, + 0x73bda2c656d48a97, + 0xf283d71a95c7a8f3, + 0xdce6987ba4dbc871, + 0xf519823ba29eb5cd, + 0xb946782fe2c1f54b, + 0x48b6c12432d514b7, + 0xb9851c376fc93425, + 0xd27e93b76ecb5391, + 0xb127acf76a9b51fd, + 0xa419fc28789e6f5b, + 0x4c7369fcb6a28ec7, + 0x2b8637cfe7b6ad35, + 0x6e8c2731f497bca1, + 0xcd6bf5932489ca1f, + 0xe624ca84328de97b, + 0xc85ed92763b219e7, + 0xb2acd7498fb42965, + 0xed631cfa9ea847c1, + 0x21c47e8cbc9a563f, + 0x679a8f2fea8d649b, + 0x7d9cf16fe7af8419, + 0xd4ab278219a3b285, + 0x52fe3cb54796b2e1, + 0x2daf68e65387be4f, + 0xac6348765268deab, + 0x5dc3bef9817cfd29, + 0x5f7dc86cbf812d95, + 0xbd9a736dcd854bf1, + 0xf31adbcfec874a6f, + 0x7ed832a21c6958db, + 0xca73f8e32b6d7849, + 0x5984f6c4386f97b5, + 0x648d2e7ba894c723, + 0x2bd574eba375c48f, + 0x9b432c8ba267d3fb, + 0x6a9bef8ed17bf269, + 0x124a78ddcf7e12d5, + 0x62e79cb54f926153, + 0x3f89ec432c634e9f, + 0xa3286c954b576e1d, + 0x7b689a265b4a6d79, + 0xc238f4da974c8be5, + 0x42df6b3dc75fab63, + 0xa4395b7ed452c8bf, + 0xc412d681f265e83d, + 0x56e7db921247f6a9, + 0x2489ebc6536c2817, + 0x813dfec87f5e2683, + 0x9fd173498c6154df, + 0x72e1c68bac64735d, + 0x5b726a4edb4672c9, + 0xacb2345fe95ba137, + 0x29f6d5afe64caf93, + 0xe6f92c72153d9cef, + 0x8df14ce43542ec6d, + 0x38fe17d76234fbd9, + 0x7cf95e3ba2591c47, + 0xf69b14e98f4c2ab3, + 0x91f73a4cbd4e5a31, + 0xb625f84fec31578d, + 0x6f5c9a7feb2376f9, + 0x3e45af621c28a567, + 0x263dfa154829a5d3, + 0xcd85a2f8783dc451, + 0x9e1ca268753fc2ad, + 0x8b5f3ceba654f12b, + 0xe38f94aed3462197, + 0x836fc7acbd182fe3, + 0x3b1e7cd1fd2b4e61, + 0x76e4d1f32a1e4cbd, + 0xaef68b265d217c3b, + 0x3967bdc65c138ba7, + 0xa136b4e98927ba15, + 0xd945c27cb62ac981, + 0x8e2fd1ba941ab6ed, + 0x5439ed7dc31fe65b, + 0x1e9375b1f42315c7, + 0xed46921874182635, + 0x65f8acd43ef854a1, + 0x6d24b8965cea631f, + 0x6f4ced865afd617b, + 0x86dcae3658ce6fd7, + 0x1ce7946cb8f2ae45, + 0xf975d21dc6f5adb1, + 0xc7621faed4e7cb2f, + 0xc43b8a9213f9ea8b, + 0x419a6d7432dce9f7, + 0x617fedb983f12a75, + 0xf15ebc687fe548d1, + 0x75bca84a9cd8574f, + 0xf41d2b598ce965ab, + 0xef428a5dcaed8529, + 0xa6f291bfe7dfa395, + 0x6d8c5bf328d4b3f1, + 0xfbde427437d5c16f, + 0x23598af543a6dfcb, + 0xcaf85d3762cafe39, + 0x57ed6cb982cd1ea5, + 0x6b89f3dbafc25d13, + 0x9cb8f56badc34b7f, + 0xbc3e45a1fac659eb, + 0x64a8bcd21cdb7a59, + 0xf546bc7327bd98c5, + 0x64a7bcd657cfb843, + 0xab36429876b2c59f, + 0xf81b5a4a94b6e51d, + 0x3845f7dcb2c8f379, + 0x8fe4579ed2cb13e5, + 0x1a2e78cedfbe4263, + 0x8c245b743ea251bf, + 0x4ce587243ca46f2d, + 0xd72eabc43cb56e89, + 0xe72afc3547a98cf5, + 0xd417c3f9869dac73, + 0x27c9e3f9847ea9cf, + 0x271b3a4dc5a2e94d, + 0x849c5f1fe2a4f7b9, + 0x547baf1434ca1927, + 0xda19fb8651bc2793, + 0x793ab5154d8c35ef, + 0x16eabd998ea1746d, + 0x2c5ae7b98ca473d9, + 0x86b2af3edcb8a247, + 0xdab5643fe789a1b3, + 0x7adc584fe68cbf21, + 0xe49db322146fbe7d, + 0xeda1f9743472fce9, + 0xc3e6b72983a61d57, + 0x8b1945d871982bc3, + 0x6bc1e72a9f8c5b41, + 0x46ced75bac6e489d, + 0xc1daf53fed92781b, + 0x3de5ac61fc93a687, + 0xd7cea6221b87a6e3, + 0x186ae794398ac561, + 0x85a362c5456ac3bd, + 0x4acb73f9857fe23b, + 0x7f49e3bdc59412a7, + 0xab459f7ed3a84215, + 0xb395f76dce694f71, + 0xc9dea851fb594ecd, + 0x438aec721c5e6d4b, + 0x6b98ad243d518cb7, + 0xe8c5fb776c74ab25, + 0xd2ec1bf87856ca91, + 0x4ab8d53a9548b7fd, + 0x17def46ba34ce76b, + 0x4cae563cb24ef5d7, + 0xa695d141f1932745, + 0x8954f264328745b1, + 0xce2f9ad43e59642f, + 0x7b1294e65e4c628b, + 0x291e8bd76b4d81f7, + 0x8fb13dca9b41af65, + 0xf2438e6cb854aec1, + 0xbc7a149ed746bc3f, + 0xa8d34761f437ec9b, + 0x5647fea3254cfb19, + 0x3527b897634f1b85, + 0xecb546a9826349e1, + 0x21746eda9e26485f, + 0x6bd812ca9e2856cb, + 0x8197fa5cbd2c8639, + 0x643a785edb2e94a5, + 0xe7845161fa62c513, + 0x2fb3da621934c27f, + 0xd5ba13e54736d1eb, + 0xbe39f1576528ef49, + 0xa91e3c69843c1fb5, + 0x2145b68ba15f4e23, + 0xfe26817bae124c8f, + 0xb4f2981dcd145afb, + 0x192ed4a1fd187b69, + 0x583e67c32c1b89d5, + 0xfc6798154a1eb953, + 0xfc94db365821c6af, + 0x67ed32aa9814e62d, + 0xe3d621acb516f489, + 0xe1743a2dc62a14f5, + 0xbf74965fe51d2473, + 0x79e2cd3babed42cf, + 0x271c45f43ef2714d, + 0x185b7fa32ce36fa9, + 0x916afc754bf69e17, + 0x8412369657f9ad83, + 0x3527d91765eb9adf, + 0x7cb9f1d984efca5d, + 0x4523fd9cb4e2f8c9, + 0xf49bd28fe4f61a37, + 0xc235a98214f928a3, + 0xdbe17c3763fc5821, + 0xc1f7da543fce457d, + 0xa5ecb1f76cd174e9, + 0xa6e5d1ca9ce4a357, + 0x3f7ed24cb9e7a2c3, + 0x69a35e2ed8eac241, + 0x96f7a83fe4cabf8d, + 0x9eb53d4214aecdf9, + 0xde38ac5545d31e67, + 0x6425df8874e62cd3, + 0x4a6279e982e94c51, + 0x7fe9bd376fcb49ad, + 0xd95214398dce692b, + 0xc39fa42fecd1a897, + 0xd5b68fafe9c4a7f3, + 0xb5ed61432ad8c671, + 0x95bf836326a8b4cd, + 0xdfae892656ace34b, + 0xd175439764aef2b7, + 0x5f8437ecb7d64325, + 0x563ea18dc3d75291, + 0x7c2841ebac974fed, + 0x2b6e91d1fd9a6e5b, + 0xb5a97e321b9e6dc7, + 0x2b85a7e54db1ac35, + 0xac6d7f965894cba1, + 0xf27963d657a6c91f, + 0xf31d5a8764a9e87b, + 0x91e6c7bba39bf6e7, + 0x2b3fc19ed3bf1865, + 0xab16c321f2b346c1, + 0xf38ced5321b7653f, + 0xca5348d32fa8639b, + 0xb91f2ca65eac8319, + 0x37ac18b76c9ea185, + 0xc5264a987982afd1, + 0xb7fe8d1ba783bd4f, + 0xaf14297dc475edab, + 0xaf37b2dfe478fc29, + 0x1f758963248d1c95, + 0x4c3fd8a6548e3af1, + 0xbf4253e871a2496f, + 0x9b754d376f8457db, + 0x8fa4629cbe6a8749, + 0x4dc72e8bad7c96b5, + 0x2f9c751eda8eb623, + 0x2185af9fe971c38f, + 0x5b4a2d621874d2fb, + 0x874a1de43587f169, + 0xbf29ace8768a21d5, + 0xcea14d2a958c2f43, + 0xa49d2e69816e3d9f, + 0xce2846fbaf736c1d, + 0x2ae8c91ede546c79, + 0x7ba48961fc478ae5, + 0x7ac5de621d5cba63, + 0xe1d583c3284da7bf, + 0x863712465961e73d, + 0x5a164bd98763f5a9, + 0x87adf25dc5892617, + 0x3b9f518ed47b2583, + 0x645b9f3dc16b43df, + 0x2879bf4dce4f625d, + 0x5b843c732f5371c9, + 0x6a8179e43d459f27, + 0x68ace4165c47ae93, + 0x6de1b4f657389bef, + 0xa5f31979873ecb6d, + 0x425a1f9cb641fad9, + 0xba78652fe8651b47, + 0xea7c3811f45729b3, + 0x5c94bfd3246b5931, + 0xb1ec2346513c468d, + 0x59731e254d2e65f9, + 0xb851f73a9e32a467, + 0x264ec3aa9c26a4d3, + 0xe4b158cedb49c351, + 0xa8c3f24fe739c1ad, + 0x2978561fe63cdf1b, + 0x7c8256d439421f87, + 0x4c8f2ae767452de3, + 0x837f6baa95384d61, + 0xab63e9f871284abd, + 0x126cd3798f1d6a3b, + 0xc63e18dcbd1f69a7, + 0xfa176d5fed23b915, + 0x9437ed21fb25c781, + 0x84c9b3d32917b5ed, + 0xd4c7b9e4381ae45b, + 0xba9e1f76561df3c7, + 0xc7941a5cb9612435, + 0x9b54f13dc72653a1, + 0x365eab4dc438621f, + 0x48e6932bade85f6b, + 0x769b31fdcbfa6ed7, + 0xa825fb421bfe9d45, + 0xef21d58549f2acb1, + 0x8f9cda1658e4ca2f, + 0x65798bc546f5e98b, + 0x8cf19b2764d9e8f7, + 0x591f2edcb4fd1975, + 0x94d125acb4ef37d1, + 0xfb167e3ed1e2564f, + 0x8b63fe4321f564ab, + 0xdc91ae643fea8429, + 0x21fbe3c54deca295, + 0x15b3f7e769cda2f1, + 0xef2965c878c1be5f, + 0xdb7612f986a3decb, + 0x538dcf2cb5c6fd39, + 0x589d7421f4e91da5, + 0xa98cb4f326ed4c13, + 0x5ed9f8c542ce3a7f, + 0x8cdfe7a761d258eb, + 0xf9821a476fd47859, + 0xf93aeb176ed897c5, + 0xc86213fa9adcb743, + 0xbe45218dc7adb49f, + 0xa8d62b41f8b2e41d, + 0x85943bd218c4f279, + 0x6e25df9547c812e5, + 0xf41e697987db4163, + 0x5d39e417629b3eaf, + 0xb23c9e4981af5e2d, + 0x58d24f3bafb26d89, + 0xdae2967dcda48bf5, + 0x7641c8d1fdc8ab73, + 0x43ba69d21b79a8cf, + 0x93e86c73279ec84d, + 0x8fcd7a3547a1f6b9, + 0x264938cba9c51827, + 0xf9123d7cb5c82693, + 0x3df6e54cb2a934ef, + 0x47f1d8cfe1ac536d, + 0x2b643e9dce8f62d9, + 0x7a9c86f32fb3a147, + 0x83bf76132d859fa3, + 0xd7c824b65c98be21, + 0x92adf6154869bc7d, + 0xda948158756cdbe9, + 0x83b941fed8a21c57, + 0x7da125ffe6952ac3, + 0x192e65c1f3b85a41, + 0x89ade3f2128a479d, + 0x8e9671c5429d671b, + 0x5bdf42643e6f9587, + 0xedcf6a387d82a5e3, + 0xb75ef84bad97c461, + 0xc247efbba967c2bd, + 0x87e4a52ed87ae13b, + 0xc38ae17ed45cef97, + 0xe1a35d6547812ef3, + 0xd2a518c436954e71, + 0xa19d8f3652764bcd, + 0x9f1d5ca981796c4b, + 0x7b152fe98f4d6ab7, + 0x5a76138cbd6f9a25, + 0xd791625fed63c891, + 0xc6b7193fe954b6fd, + 0x694d5fc21a48e56b, + 0xe86f15c3285af4d7, + 0xc6a45fe8798e1645, + 0x3467f9cba78254b1, + 0xc371d24cb485632f, + 0x17f3469ed257618b, + 0x9edf164cbd396fe7, + 0xab196341fd3c9e65, + 0xe3f75ab32b4f9dc1, + 0x36ec25854a52cb3f, + 0xf9b12c465834ea9b, + 0x3afc7de76847fa19, + 0x6187f9dcb74c1a85, + 0x7e325afcb65d38e1, + 0x317986aed361475f, + 0x2e3bd941f14365cb, + 0xd3ec875321478539, + 0x5ba2f8354f2b93a5, + 0x6d834f187e5db413, + 0xe387af476a3eb17f, + 0x14bce8a87832cfdb, + 0x612d5afcb825fe49, + 0xa368e7bed7381eb5, + 0xc3b69271f75b4d23, + 0xdaf8bce2152d3b8f, + 0x2e5bd877643159fb, + 0xdfb514e981237a69, + 0x4932bcd87f1698d5, + 0xae8dc52a9e1ab853, + 0xb63c5249891cb5af, + 0xdc34981cb91fc52d, + 0xbc342f1fea12f389, + 0xf78b6a254a2713f5, + 0x13f4cad7691a4273, + 0xde9a32b8762a41cf, + 0xda54e379841c5f3d, + 0x624e713cb3216ea9, + 0x93f216bbaef39d17, + 0xa2618f7cbdf5ac83, + 0x263ebf8dc8e6a9df, + 0x4cb6e8d218fac95d, + 0xa31f6ce326fde7c9, + 0x3d142c576af21937, + 0xcdaf586a98f527a3, + 0x91a36d2cb6f95721, + 0x3ec6a17cb2fa547d, + 0x1239aeccb1fc63e9, + 0xfb43825dcedf9257, + 0xde4c15732fe4a1c3, + 0x1a7c3be54cd6bf31, + 0x26db4c5439c6be8d, + 0xd8b1ae6546b8dcf9, + 0x1f64d53985bdfc67, + 0x69732bdba7e12bd3, + 0xeb45678ed7e64b51, + 0x96e4bd71f2e648ad, + 0xd2bf368213ea682b, + 0x284deb6431ed8697, + 0xe9dcf3a54dbe96f3, + 0x5e619cf98ed3c571, + 0x93ed18f879a5b3cd, + 0x9e381bdba9c8e24b, + 0x67a9248ed6caf1b7, + 0x1a596c41f8ce3125, + 0x5192874437c24f81, + 0xb174a6d325a34ced, + 0xda81265542c76d5b, + 0xac2e47d651d96bc7, + 0x3cf2b5d87fad9b35, + 0x23419cf87d8fb9a1, + 0xe21bc6fedba3c81f, + 0x37a4d211f9a4e67b, + 0x6b928c5219a8f5e7, + 0xafc892b439bc1765, + 0x758ad1e767ae35c1, + 0x3a48cf5a97b1643f, + 0x5cf3647ba3c4629b, + 0x7f54e32ed3c78219, + 0x92dba3fdce8a9f75, + 0xe3d68ac1fc7b9ed1, + 0xde397c621b7eac4f, + 0xc6fa74543972ecab, + 0x3adf98554a85fb29, + 0xa32cb97767a81b95, + 0x6b18592ba68b39f1, + 0xfca2e3dcb49d386f, + 0x816b3a2fe39156db, + 0x1543aec1f1b38649, + 0x391bec8321a794b5, + 0xf6ba25154f8ab523, + 0xfd3cb1e54d6cb28f, + 0x8cfab766596ec1fb, + 0x42615c798a72ef59, + 0xd84c536cb9861fc5, + 0x4ab79f1ed7892e43, + 0x3a879cdfe46a3c9f, + 0xc6fae143247e5b1d, + 0x8fa3571543816b79, + 0xfc371957617389e5, + 0x25acbf498f57b963, + 0xef2dc9187d48a6bf, + 0xf17d62ba9a5bc63d, + 0x4b2af98dc85fe4a9, + 0x918cb431fb942517, + 0xe38da6c21b972483, + 0x768f9a54376842df, + 0x6c9d7a19847b615d, + 0xbfa1ce28724d5fb9, + 0x759e1dfcb3619e27, + 0x187d6a9cbf54ad93, + 0x36742f1cbc359aef, + 0xdbe5c6a1fb38ca6d, + 0x27b89ca21a3be8d9, + 0x3e8bc6432a3ef947, + 0xbf385d187a6428b3, + 0x14c273acba675831, + 0xe5a6932cb639458d, + 0xf63bda5dc23b64f9, + 0x29bc83aed14e9367, + 0x1dc8a5ffef51a2d3, + 0x9fa824643f46c251, + 0x47f2b5843c25bf9d, + 0xb74ec8265a38de1b, + 0x94e2db16592bfd87, + 0xaef6185a984f1ce3, + 0x8be21c7ed9534c61, + 0x9a3c174fe62549bd, + 0xe45a1c71f428693b, + 0x4ec8d2b2132c68a7, + 0x9d23c417623ea815, + 0xd25b6e487f32c681, + 0x4ec98fa87c13b4ed, + 0x7a8b421a9c17e35b, + 0xf2a189dcba19f2c7, + 0xfd7a6b1fea4d1235, + 0x8234f79fe83f42a1, + 0x4cf78d1437124efd, + 0x475e1c9437145e6b, + 0xab8c239653186cd7, + 0x6ecbd1a9821b9c45, + 0x21b5f3776efd9ab1, + 0x3f48c2587adeb92f, + 0x3fa5b42dcaf2e78b, + 0x5831fa7dc9d4e6f7, + 0xf6b7ac332bfa1875, + 0x68925d7548fb36d1, + 0x7c2b84a767ed354f, + 0x695ce3b985f163ab, + 0xc1a6758cb4f58329, + 0x324ae85dc2f7a195, + 0x3c2b4d5badc89fe1, + 0x5a3fc84fe9cbad5f, + 0x2bf74862189fadcb, + 0xe6fb9a854ad2fc39, + 0xfd5eab3549e61ca5, + 0x391afb4878e94b13, + 0x276f9ed985db397f, + 0x1ea67c4a93cd47eb, + 0x415a37bed3e18759, + 0x14358921f1e396c5, + 0xd84165f321e8b643, + 0xe3c584632ec8b39f, + 0x14fe69765eabc31d, + 0x13bf2a765abfe179, + 0xe5a3f8ba9ac421e5, + 0x43265adcb9c72f53, + 0x1543f78dc5b73daf, + 0x5164bdc1f4ba5c2d, + 0x5273b4d213be5c89, + 0xc21fa6d543c18af5, + 0xb38a295761d4ba73, + 0xac6398754e95a7cf, + 0x81279ed76ea9c74d, + 0xc83f42187a8ce5b9, + 0x43f7958dc9aef527, + 0x7ac19461fac42593, + 0xcbf98d3218a643ef, + 0xdf7ec6b437b9526d, + 0x1acd24e654ab61d9, + 0x95cfb8a762ad8f37, + 0x192fc34982b19ea3, + 0x967f8d5baf95bd21, + 0x6132dc9bae85cb7d, + 0x8de153b1fb67dae9, + 0x82e4a6b21b8cfa57, + 0x9ae638c54a8f19c3, + 0x9ae486587ab35941, + 0x2e36dc1987a5469d, + 0x4fb7932dc4a9761b, + 0x3f958abed2ac9487, + 0x7d29148dc18d94e3, + 0x1a4fb3cfef92c361, + 0xf6b7da132f74c1bd, + 0xdf524e843c76df2b, + 0x4a19bd543b58fe97, + 0x8d5217b7697b1df3, + 0xb875649ba98f3d71, + 0x4d73825cb6724acd, + 0x3b52cadfe3856a4b, + 0xe96a8b41f25869b7, + 0x7e2538a2137ca925, + 0x93af56b5426eb791, + 0xf3b987154e61b5fd, + 0x5e7fd3198d73e46b, + 0xf87edbca9b56f3d7, + 0xe8f537cedc8b1345, + 0x8cf39d6fe97d43b1, + 0x63a85feed87e512f, + 0xcb53f98218625f7b, + 0xe97adb6323546de7, + 0x368aef5872489d65, + 0xaecd6138725a9bc1, + 0x45b928e87e4dba3f, + 0xed7bc8fbad41e89b, + 0x642a315edc54f819, + 0x892ea651fc471985, + 0x371d8ba32b5a37e1, + 0xfd6819a3294c365f, + 0xa47df9e7673f54cb, + 0x647eaf9cb7628439, + 0x9a32468dc34692a5, + 0x8fc4139ed469b213, + 0x7c948edcbd29ae6f, + 0x7a68d5e1f92caedb, + 0xdecb15432c31fd49, + 0xb28d5c176c341db5, + 0x2c9ba6487b584c23, + 0xf4ea215767293a8f, + 0x3125d6aa962c48fb, + 0x8937d52dc42f5869, + 0x5423dbcfe43297d5, + 0x74d835b1f126b753, + 0x59fe4d743127b4af, + 0xf217ce465f1ac42d, + 0x12dba9c65c1de289, + 0x75ac4f3a9c4312f5, + 0x8129eaccbc264173, + 0x9d216ceba8163ebf, + 0x64ab3e8dc7195e3d, + 0xe632b871f41c5da9, + 0x27de19f4352f8c17, + 0x7fb493a76512ab83, + 0xfba87d576214a8df, + 0x52137ba54ef6c85d, + 0x3bfa76465bf8e6c9, + 0xfbc5d27a9aecf637, + 0xd5a12b8dc9ef16a3, + 0xfd3c798feaf45621, + 0xac4e8d5219f6537d +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/random_iterator/detail/functors/EngineCaller.hpp b/random_iterator/detail/functors/EngineCaller.hpp new file mode 100644 index 0000000..0b255b0 --- /dev/null +++ b/random_iterator/detail/functors/EngineCaller.hpp @@ -0,0 +1,91 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * EngineCaller.hpp + * + * Created on: 23/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#pragma once + +#include <stdint.h> +#include <random_iterator/Engine.hpp> + +namespace random_iterator { + +namespace detail { + +template<typename DistibutionType, typename EngineType> +struct EngineCaller +{ + typedef EngineType engine_type; + typedef typename engine_type::state_type state_type; + typedef typename engine_type::seed_type seed_type; + typedef typename engine_type::advance_type advance_type; + typedef typename engine_type::init_type init_type; + + typedef DistibutionType distribution_type; + typedef typename distribution_type::result_type result_type; + + EngineCaller() = delete; + + EngineCaller(distribution_type const& dist , seed_type seed, uint32_t stream ): + distribution_(dist), + seed_(seed), + stream_(stream) + {} + + EngineCaller( EngineCaller<DistibutionType, EngineType> const& other ): + distribution_(other.distribution_), + seed_(other.seed_), + stream_(other.stream_) + { } + + EngineCaller<DistibutionType, EngineType>& + operator=( EngineCaller<DistibutionType, EngineType> const& other ){ + + if(this == &other) return *this; + + distribution_ = other.distribution_ ; + seed_ = other.seed_ ; + stream_ = other.stream_; + + return *this; + } + + inline result_type operator()(advance_type n) const { + + EngineType eng(seed_, stream_ ); + eng.discard( n); + + return static_cast<distribution_type>(distribution_)(eng); + + } + + distribution_type distribution_; + seed_type seed_; + uint32_t stream_; +}; + +} // namespace detail + +} // namespace random_iterator diff --git a/random_iterator/detail/tbb/internal/_tbb_windef.h b/random_iterator/detail/tbb/internal/_tbb_windef.h new file mode 100644 index 0000000..e43d9db --- /dev/null +++ b/random_iterator/detail/tbb/internal/_tbb_windef.h @@ -0,0 +1,69 @@ +/* + Copyright (c) 2005-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_tbb_windef_H +#error Do not #include this internal file directly; use public TBB headers instead. +#endif /* __RANDOM_ITERATOR_TBB_tbb_windef_H */ + +// Check that the target Windows version has all API calls required for TBB. +// Do not increase the version in condition beyond 0x0500 without prior discussion! +#if defined(_WIN32_WINNT) && _WIN32_WINNT<0x0501 +#error TBB is unable to run on old Windows versions; _WIN32_WINNT must be 0x0501 or greater. +#endif + +#if !defined(_MT) +#error TBB requires linkage with multithreaded C/C++ runtime library. \ + Choose multithreaded DLL runtime in project settings, or use /MD[d] compiler switch. +#endif + +// Workaround for the problem with MVSC headers failing to define namespace std +namespace std { + using ::size_t; using ::ptrdiff_t; +} + +#define __RANDOM_ITERATOR_TBB_STRING_AUX(x) #x +#define __RANDOM_ITERATOR_TBB_STRING(x) __RANDOM_ITERATOR_TBB_STRING_AUX(x) + +// Default setting of RANDOM_ITERATOR_TBB_USE_DEBUG +#ifdef RANDOM_ITERATOR_TBB_USE_DEBUG +# if RANDOM_ITERATOR_TBB_USE_DEBUG +# if !defined(_DEBUG) +# pragma message(__FILE__ "(" __RANDOM_ITERATOR_TBB_STRING(__LINE__) ") : Warning: Recommend using /MDd if compiling with RANDOM_ITERATOR_TBB_USE_DEBUG!=0") +# endif +# else +# if defined(_DEBUG) +# pragma message(__FILE__ "(" __RANDOM_ITERATOR_TBB_STRING(__LINE__) ") : Warning: Recommend using /MD if compiling with RANDOM_ITERATOR_TBB_USE_DEBUG==0") +# endif +# endif +#endif + +#if (__RANDOM_ITERATOR_TBB_BUILD || __RANDOM_ITERATOR_TBBMALLOC_BUILD || __RANDOM_ITERATOR_TBBBIND_BUILD) && !defined(__RANDOM_ITERATOR_TBB_NO_IMPLICIT_LINKAGE) +#define __RANDOM_ITERATOR_TBB_NO_IMPLICIT_LINKAGE 1 +#endif + +#if _MSC_VER + #if !__RANDOM_ITERATOR_TBB_NO_IMPLICIT_LINKAGE + #ifdef __RANDOM_ITERATOR_TBB_LIB_NAME + #pragma comment(lib, __RANDOM_ITERATOR_TBB_STRING(__RANDOM_ITERATOR_TBB_LIB_NAME)) + #else + #ifdef _DEBUG + #pragma comment(lib, "tbb_debug.lib") + #else + #pragma comment(lib, "tbb.lib") + #endif + #endif + #endif +#endif diff --git a/random_iterator/detail/tbb/internal/_template_helpers.h b/random_iterator/detail/tbb/internal/_template_helpers.h new file mode 100644 index 0000000..f9f4de0 --- /dev/null +++ b/random_iterator/detail/tbb/internal/_template_helpers.h @@ -0,0 +1,311 @@ +/* + Copyright (c) 2005-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_template_helpers_H +#define __RANDOM_ITERATOR_TBB_template_helpers_H + +#include <utility> +#include <cstddef> +#include "../tbb_config.h" +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT +#include <type_traits> +#endif +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT +#include <iterator> +#include <memory> // allocator_traits +#endif + +namespace random_iterator_tbb { namespace internal { + +//! Enables one or the other code branches +template<bool Condition, typename T = void> struct enable_if {}; +template<typename T> struct enable_if<true, T> { typedef T type; }; + +//! Strips its template type argument from cv- and ref-qualifiers +template<typename T> struct strip { typedef T type; }; +template<typename T> struct strip<const T> { typedef T type; }; +template<typename T> struct strip<volatile T> { typedef T type; }; +template<typename T> struct strip<const volatile T> { typedef T type; }; +template<typename T> struct strip<T&> { typedef T type; }; +template<typename T> struct strip<const T&> { typedef T type; }; +template<typename T> struct strip<volatile T&> { typedef T type; }; +template<typename T> struct strip<const volatile T&> { typedef T type; }; +//! Specialization for function pointers +template<typename T> struct strip<T(&)()> { typedef T(*type)(); }; +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT +template<typename T> struct strip<T&&> { typedef T type; }; +template<typename T> struct strip<const T&&> { typedef T type; }; +template<typename T> struct strip<volatile T&&> { typedef T type; }; +template<typename T> struct strip<const volatile T&&> { typedef T type; }; +#endif +//! Specialization for arrays converts to a corresponding pointer +template<typename T, std::size_t N> struct strip<T(&)[N]> { typedef T* type; }; +template<typename T, std::size_t N> struct strip<const T(&)[N]> { typedef const T* type; }; +template<typename T, std::size_t N> struct strip<volatile T(&)[N]> { typedef volatile T* type; }; +template<typename T, std::size_t N> struct strip<const volatile T(&)[N]> { typedef const volatile T* type; }; + +//! Detects whether two given types are the same +template<class U, class V> struct is_same_type { static const bool value = false; }; +template<class W> struct is_same_type<W,W> { static const bool value = true; }; + +template<typename T> struct is_ref { static const bool value = false; }; +template<typename U> struct is_ref<U&> { static const bool value = true; }; + +//! Partial support for std::is_integral +template<typename T> struct is_integral_impl { static const bool value = false; }; +template<> struct is_integral_impl<bool> { static const bool value = true; }; +template<> struct is_integral_impl<char> { static const bool value = true; }; +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT +template<> struct is_integral_impl<char16_t> { static const bool value = true; }; +template<> struct is_integral_impl<char32_t> { static const bool value = true; }; +#endif +template<> struct is_integral_impl<wchar_t> { static const bool value = true; }; +template<> struct is_integral_impl<short> { static const bool value = true; }; +template<> struct is_integral_impl<int> { static const bool value = true; }; +template<> struct is_integral_impl<long> { static const bool value = true; }; +template<> struct is_integral_impl<long long> { static const bool value = true; }; + +template<typename T> +struct is_integral : is_integral_impl<typename strip<T>::type> {}; + +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT +//! std::void_t internal implementation (to avoid GCC < 4.7 "template aliases" absence) +template<typename...> struct void_t { typedef void type; }; +#endif + +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT + +// Generic SFINAE helper for expression checks, based on the idea demonstrated in ISO C++ paper n4502 +template<typename T, typename, template<typename> class... Checks> +struct supports_impl { typedef std::false_type type; }; +template<typename T, template<typename> class... Checks> +struct supports_impl<T, typename void_t<Checks<T>...>::type, Checks...> { typedef std::true_type type; }; + +template<typename T, template<typename> class... Checks> +using supports = typename supports_impl<T, void, Checks...>::type; + +#endif /* __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT */ + +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT + +//! Allows to store a function parameter pack as a variable and later pass it to another function +template< typename... Types > +struct stored_pack; + +template<> +struct stored_pack<> +{ + typedef stored_pack<> pack_type; + stored_pack() {} + + // Friend front-end functions + template< typename F, typename Pack > friend void call( F&& f, Pack&& p ); + template< typename Ret, typename F, typename Pack > friend Ret call_and_return( F&& f, Pack&& p ); + +protected: + // Ideally, ref-qualified non-static methods would be used, + // but that would greatly reduce the set of compilers where it works. + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, const pack_type& /*pack*/, Preceding&&... params ) { + return std::forward<F>(f)( std::forward<Preceding>(params)... ); + } + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, pack_type&& /*pack*/, Preceding&&... params ) { + return std::forward<F>(f)( std::forward<Preceding>(params)... ); + } +}; + +template< typename T, typename... Types > +struct stored_pack<T, Types...> : stored_pack<Types...> +{ + typedef stored_pack<T, Types...> pack_type; + typedef stored_pack<Types...> pack_remainder; + // Since lifetime of original values is out of control, copies should be made. + // Thus references should be stripped away from the deduced type. + typename strip<T>::type leftmost_value; + + // Here rvalue references act in the same way as forwarding references, + // as long as class template parameters were deduced via forwarding references. + stored_pack( T&& t, Types&&... types ) + : pack_remainder(std::forward<Types>(types)...), leftmost_value(std::forward<T>(t)) {} + + // Friend front-end functions + template< typename F, typename Pack > friend void call( F&& f, Pack&& p ); + template< typename Ret, typename F, typename Pack > friend Ret call_and_return( F&& f, Pack&& p ); + +protected: + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, pack_type& pack, Preceding&&... params ) { + return pack_remainder::template call<Ret>( + std::forward<F>(f), static_cast<pack_remainder&>(pack), + std::forward<Preceding>(params)... , pack.leftmost_value + ); + } + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, const pack_type& pack, Preceding&&... params ) { + return pack_remainder::template call<Ret>( + std::forward<F>(f), static_cast<const pack_remainder&>(pack), + std::forward<Preceding>(params)... , pack.leftmost_value + ); + } + template< typename Ret, typename F, typename... Preceding > + static Ret call( F&& f, pack_type&& pack, Preceding&&... params ) { + return pack_remainder::template call<Ret>( + std::forward<F>(f), static_cast<pack_remainder&&>(pack), + std::forward<Preceding>(params)... , std::move(pack.leftmost_value) + ); + } +}; + +//! Calls the given function with arguments taken from a stored_pack +template< typename F, typename Pack > +void call( F&& f, Pack&& p ) { + strip<Pack>::type::template call<void>( std::forward<F>(f), std::forward<Pack>(p) ); +} + +template< typename Ret, typename F, typename Pack > +Ret call_and_return( F&& f, Pack&& p ) { + return strip<Pack>::type::template call<Ret>( std::forward<F>(f), std::forward<Pack>(p) ); +} + +template< typename... Types > +stored_pack<Types...> save_pack( Types&&... types ) { + return stored_pack<Types...>( std::forward<Types>(types)... ); +} + +#endif /* __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT */ + +#if __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT + +using std::index_sequence; +using std::make_index_sequence; + +#elif __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT + +template<std::size_t... S> class index_sequence {}; + +template<std::size_t N, std::size_t... S> +struct make_index_sequence_impl : make_index_sequence_impl < N - 1, N - 1, S... > {}; + +template<std::size_t... S> +struct make_index_sequence_impl <0, S...> { + using type = index_sequence<S...>; +}; + +template<std::size_t N> +using make_index_sequence = typename tbb::internal::make_index_sequence_impl<N>::type; + +#endif /* __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT */ + +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT +template<typename... Args> +struct conjunction; + +template<typename First, typename... Args> +struct conjunction<First, Args...> + : std::conditional<bool(First::value), conjunction<Args...>, First>::type {}; + +template<typename T> +struct conjunction<T> : T {}; + +template<> +struct conjunction<> : std::true_type {}; + +#endif + +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT + +template< typename Iter > +using iterator_value_t = typename std::iterator_traits<Iter>::value_type; + +template< typename Iter > +using iterator_key_t = typename std::remove_const<typename iterator_value_t<Iter>::first_type>::type; + +template< typename Iter > +using iterator_mapped_t = typename iterator_value_t<Iter>::second_type; + +template< typename A > using value_type = typename A::value_type; +template< typename A > using alloc_ptr_t = typename std::allocator_traits<A>::pointer; +template< typename A > using has_allocate = decltype(std::declval<alloc_ptr_t<A>&>() = std::declval<A>().allocate(0)); +template< typename A > using has_deallocate = decltype(std::declval<A>().deallocate(std::declval<alloc_ptr_t<A>>(), 0)); + +// value_type should be checked first because it can be used in other checks (via allocator_traits) +template< typename T > +using is_allocator = supports<T, value_type, has_allocate, has_deallocate>; + +#if __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT + +template< typename T > +static constexpr bool is_allocator_v = is_allocator<T>::value; + +#endif /*__RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES */ + +template< std::size_t N, typename... Args > +struct pack_element { + using type = void; +}; + +template< std::size_t N, typename T, typename... Args > +struct pack_element<N, T, Args...> { + using type = typename pack_element<N - 1, Args...>::type; +}; + +template< typename T, typename... Args > +struct pack_element<0, T, Args...> { + using type = T; +}; + +template< std::size_t N, typename... Args > +using pack_element_t = typename pack_element<N, Args...>::type; + +// Helper alias for heterogeneous lookup functions in containers +// template parameter K and std::conditional are needed to provide immediate context +// and postpone getting is_trasparent from the compare functor until method instantiation. +template <typename Comp, typename K> +using is_transparent = typename std::conditional<true, Comp, K>::type::is_transparent; + +#endif /* __RANDOM_ITERATOR_TBB_CPP11_PRESENT */ + +template <typename F> +struct body_arg_detector; + +template <typename Callable, typename ReturnType, typename T> +struct body_arg_detector<ReturnType(Callable::*)(T)> { + typedef T arg_type; +}; + +template <typename Callable, typename ReturnType, typename T> +struct body_arg_detector<ReturnType(Callable::*)(T) const> { + typedef T arg_type; +}; + +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT +using std::conditional; +#else +template <bool C, typename T, typename U> +struct conditional { + typedef U type; +}; + +template <typename T, typename U> +struct conditional<true, T, U> { + typedef T type; +}; +#endif + +} } // namespace internal, namespace random_iterator_tbb + +#endif /* __RANDOM_ITERATOR_TBB_template_helpers_H */ diff --git a/random_iterator/detail/tbb/iterators.h b/random_iterator/detail/tbb/iterators.h new file mode 100644 index 0000000..a3a3abf --- /dev/null +++ b/random_iterator/detail/tbb/iterators.h @@ -0,0 +1,326 @@ +/* + Copyright (c) 2017-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_iterators_H +#define __RANDOM_ITERATOR_TBB_iterators_H + +#include <iterator> +#include <limits> + +#include "tbb_config.h" +#include "tbb_stddef.h" + +#if __RANDOM_ITERATOR_TBB_CPP11_PRESENT + +#include <type_traits> + +namespace random_iterator_tbb { + +template <typename IntType> +class counting_iterator { + __RANDOM_ITERATOR_TBB_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer, "Cannot instantiate counting_iterator with a non-integer type"); +public: + typedef typename std::make_signed<IntType>::type difference_type; + typedef IntType value_type; + typedef const IntType* pointer; + typedef const IntType& reference; + typedef std::random_access_iterator_tag iterator_category; + + counting_iterator() : my_counter() {} + explicit counting_iterator(IntType init) : my_counter(init) {} + + reference operator*() const { return my_counter; } + value_type operator[](difference_type i) const { return *(*this + i); } + + difference_type operator-(const counting_iterator& it) const { return my_counter - it.my_counter; } + + counting_iterator& operator+=(difference_type forward) { my_counter += forward; return *this; } + counting_iterator& operator-=(difference_type backward) { return *this += -backward; } + counting_iterator& operator++() { return *this += 1; } + counting_iterator& operator--() { return *this -= 1; } + + counting_iterator operator++(int) { + counting_iterator it(*this); + ++(*this); + return it; + } + counting_iterator operator--(int) { + counting_iterator it(*this); + --(*this); + return it; + } + + counting_iterator operator-(difference_type backward) const { return counting_iterator(my_counter - backward); } + counting_iterator operator+(difference_type forward) const { return counting_iterator(my_counter + forward); } + friend counting_iterator operator+(difference_type forward, const counting_iterator it) { return it + forward; } + + bool operator==(const counting_iterator& it) const { return *this - it == 0; } + bool operator!=(const counting_iterator& it) const { return !(*this == it); } + bool operator<(const counting_iterator& it) const {return *this - it < 0; } + bool operator>(const counting_iterator& it) const { return it < *this; } + bool operator<=(const counting_iterator& it) const { return !(*this > it); } + bool operator>=(const counting_iterator& it) const { return !(*this < it); } + +private: + IntType my_counter; +}; +} //namespace random_iterator_tbb + + +#include <tuple> + +#include "internal/_template_helpers.h" // index_sequence, make_index_sequence + +namespace random_iterator_tbb { +namespace internal { + +template<size_t N> +struct tuple_util { + template<typename TupleType, typename DifferenceType> + static void increment(TupleType& it, DifferenceType forward) { + std::get<N-1>(it) += forward; + tuple_util<N-1>::increment(it, forward); + } + template<typename TupleType, typename DifferenceType> + static bool check_sync(const TupleType& it1, const TupleType& it2, DifferenceType val) { + if(std::get<N-1>(it1) - std::get<N-1>(it2) != val) + return false; + return tuple_util<N-1>::check_sync(it1, it2, val); + } +}; + +template<> +struct tuple_util<0> { + template<typename TupleType, typename DifferenceType> + static void increment(TupleType&, DifferenceType) {} + template<typename TupleType, typename DifferenceType> + static bool check_sync(const TupleType&, const TupleType&, DifferenceType) { return true;} +}; + +template <typename TupleReturnType> +struct make_references { + template <typename TupleType, std::size_t... Is> + TupleReturnType operator()(const TupleType& t, random_iterator_tbb::internal::index_sequence<Is...>) { + return std::tie( *std::get<Is>(t)... ); + } +}; + +// A simple wrapper over a tuple of references. +// The class is designed to hold a temporary tuple of reference +// after dereferencing a zip_iterator; in particular, it is needed +// to swap these rvalue tuples. Any other usage is not supported. +template<typename... T> +struct tuplewrapper : public std::tuple<typename std::enable_if<std::is_reference<T>::value, T&&>::type...> { + // In the context of this class, T is a reference, so T&& is a "forwarding reference" + typedef std::tuple<T&&...> base_type; + // Construct from the result of std::tie + tuplewrapper(const base_type& in) : base_type(in) {} +#if __INTEL_COMPILER + // ICC cannot generate copy ctor & assignment + tuplewrapper(const tuplewrapper& rhs) : base_type(rhs) {} + tuplewrapper& operator=(const tuplewrapper& rhs) { + *this = base_type(rhs); + return *this; + } +#endif + // Assign any tuple convertible to std::tuple<T&&...>: *it = a_tuple; + template<typename... U> + tuplewrapper& operator=(const std::tuple<U...>& other) { + base_type::operator=(other); + return *this; + } +#if _LIBCPP_VERSION + // (Necessary for libc++ tuples) Convert to a tuple of values: v = *it; + operator std::tuple<typename std::remove_reference<T>::type...>() { return base_type(*this); } +#endif + // Swap rvalue tuples: swap(*it1,*it2); + friend void swap(tuplewrapper&& a, tuplewrapper&& b) { + std::swap<T&&...>(a,b); + } +}; + +} //namespace internal + +template <typename... Types> +class zip_iterator { + __RANDOM_ITERATOR_TBB_STATIC_ASSERT(sizeof...(Types)>0, "Cannot instantiate zip_iterator with empty template parameter pack"); + static const std::size_t num_types = sizeof...(Types); + typedef std::tuple<Types...> it_types; +public: + typedef typename std::make_signed<std::size_t>::type difference_type; + typedef std::tuple<typename std::iterator_traits<Types>::value_type...> value_type; +#if __INTEL_COMPILER && __INTEL_COMPILER < 1800 && _MSC_VER + typedef std::tuple<typename std::iterator_traits<Types>::reference...> reference; +#else + typedef random_iterator_tbb::internal::tuplewrapper<typename std::iterator_traits<Types>::reference...> reference; +#endif + typedef std::tuple<typename std::iterator_traits<Types>::pointer...> pointer; + typedef std::random_access_iterator_tag iterator_category; + + zip_iterator() : my_it() {} + explicit zip_iterator(Types... args) : my_it(std::make_tuple(args...)) {} + zip_iterator(const zip_iterator& input) : my_it(input.my_it) {} + zip_iterator& operator=(const zip_iterator& input) { + my_it = input.my_it; + return *this; + } + + reference operator*() const { + return random_iterator_tbb::internal::make_references<reference>()(my_it, random_iterator_tbb::internal::make_index_sequence<num_types>()); + } + reference operator[](difference_type i) const { return *(*this + i); } + + difference_type operator-(const zip_iterator& it) const { + __RANDOM_ITERATOR_TBB_ASSERT(internal::tuple_util<num_types>::check_sync(my_it, it.my_it, std::get<0>(my_it) - std::get<0>(it.my_it)), + "Components of zip_iterator are not synchronous"); + return std::get<0>(my_it) - std::get<0>(it.my_it); + } + + zip_iterator& operator+=(difference_type forward) { + internal::tuple_util<num_types>::increment(my_it, forward); + return *this; + } + zip_iterator& operator-=(difference_type backward) { return *this += -backward; } + zip_iterator& operator++() { return *this += 1; } + zip_iterator& operator--() { return *this -= 1; } + + zip_iterator operator++(int) { + zip_iterator it(*this); + ++(*this); + return it; + } + zip_iterator operator--(int) { + zip_iterator it(*this); + --(*this); + return it; + } + + zip_iterator operator-(difference_type backward) const { + zip_iterator it(*this); + return it -= backward; + } + zip_iterator operator+(difference_type forward) const { + zip_iterator it(*this); + return it += forward; + } + friend zip_iterator operator+(difference_type forward, const zip_iterator& it) { return it + forward; } + + bool operator==(const zip_iterator& it) const { + return *this - it == 0; + } + it_types base() const { return my_it; } + + bool operator!=(const zip_iterator& it) const { return !(*this == it); } + bool operator<(const zip_iterator& it) const { return *this - it < 0; } + bool operator>(const zip_iterator& it) const { return it < *this; } + bool operator<=(const zip_iterator& it) const { return !(*this > it); } + bool operator>=(const zip_iterator& it) const { return !(*this < it); } +private: + it_types my_it; +}; + +template<typename... T> +zip_iterator<T...> make_zip_iterator(T... args) { return zip_iterator<T...>(args...); } + +template <typename UnaryFunc, typename Iter> +class transform_iterator { +public: + typedef typename std::iterator_traits<Iter>::value_type value_type; + typedef typename std::iterator_traits<Iter>::difference_type difference_type; +#if __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT + typedef typename std::invoke_result<UnaryFunc, typename std::iterator_traits<Iter>::reference>::type reference; +#else + typedef typename std::result_of<UnaryFunc(typename std::iterator_traits<Iter>::reference)>::type reference; +#endif + typedef typename std::iterator_traits<Iter>::pointer pointer; + typedef typename std::random_access_iterator_tag iterator_category; + + transform_iterator(Iter it, UnaryFunc unary_func) : my_it(it), my_unary_func(unary_func) { + __RANDOM_ITERATOR_TBB_STATIC_ASSERT((std::is_same<typename std::iterator_traits<Iter>::iterator_category, + std::random_access_iterator_tag>::value), "Random access iterator required."); + } + transform_iterator(const transform_iterator& input) : my_it(input.my_it), my_unary_func(input.my_unary_func) { } + transform_iterator& operator=(const transform_iterator& input) { + my_it = input.my_it; + return *this; + } + reference operator*() const { + return my_unary_func(*my_it); + } + reference operator[](difference_type i) const { + return *(*this + i); + } + transform_iterator& operator++() { + ++my_it; + return *this; + } + transform_iterator& operator--() { + --my_it; + return *this; + } + transform_iterator operator++(int) { + transform_iterator it(*this); + ++(*this); + return it; + } + transform_iterator operator--(int) { + transform_iterator it(*this); + --(*this); + return it; + } + transform_iterator operator+(difference_type forward) const { + return { my_it + forward, my_unary_func }; + } + transform_iterator operator-(difference_type backward) const { + return { my_it - backward, my_unary_func }; + } + transform_iterator& operator+=(difference_type forward) { + my_it += forward; + return *this; + } + transform_iterator& operator-=(difference_type backward) { + my_it -= backward; + return *this; + } + friend transform_iterator operator+(difference_type forward, const transform_iterator& it) { + return it + forward; + } + difference_type operator-(const transform_iterator& it) const { + return my_it - it.my_it; + } + bool operator==(const transform_iterator& it) const { return *this - it == 0; } + bool operator!=(const transform_iterator& it) const { return !(*this == it); } + bool operator<(const transform_iterator& it) const { return *this - it < 0; } + bool operator>(const transform_iterator& it) const { return it < *this; } + bool operator<=(const transform_iterator& it) const { return !(*this > it); } + bool operator>=(const transform_iterator& it) const { return !(*this < it); } + + Iter base() const { return my_it; } +private: + Iter my_it; + const UnaryFunc my_unary_func; +}; + +template<typename UnaryFunc, typename Iter> +transform_iterator<UnaryFunc, Iter> make_transform_iterator(Iter it, UnaryFunc unary_func) { + return transform_iterator<UnaryFunc, Iter>(it, unary_func); +} + +} //namespace random_iterator_tbb + +#endif //__RANDOM_ITERATOR_TBB_CPP11_PRESENT + +#endif /* __RANDOM_ITERATOR_TBB_iterators_H */ diff --git a/random_iterator/detail/tbb/tbb_config.h b/random_iterator/detail/tbb/tbb_config.h new file mode 100644 index 0000000..a185aea --- /dev/null +++ b/random_iterator/detail/tbb/tbb_config.h @@ -0,0 +1,873 @@ +/* + Copyright (c) 2005-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_tbb_config_H +#define __RANDOM_ITERATOR_TBB_tbb_config_H + +/** This header is supposed to contain macro definitions and C style comments only. + The macros defined here are intended to control such aspects of TBB build as + - presence of compiler features + - compilation modes + - feature sets + - known compiler/platform issues +**/ + +/* This macro marks incomplete code or comments describing ideas which are considered for the future. + * See also for plain comment with TODO and FIXME marks for small improvement opportunities. + */ +#define __RANDOM_ITERATOR_TBB_TODO 0 + +/* Check which standard library we use. */ +/* __RANDOM_ITERATOR_TBB_SYMBOL is defined only while processing exported symbols list where C++ is not allowed. */ +#if !defined(__RANDOM_ITERATOR_TBB_SYMBOL) && !__RANDOM_ITERATOR_TBB_CONFIG_PREPROC_ONLY + #include <cstddef> +#endif + +// Note that when ICC or Clang is in use, __RANDOM_ITERATOR_TBB_GCC_VERSION might not fully match +// the actual GCC version on the system. +#define __RANDOM_ITERATOR_TBB_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) + +// Prior to GCC 7, GNU libstdc++ did not have a convenient version macro. +// Therefore we use different ways to detect its version. +#if defined(RANDOM_ITERATOR_TBB_USE_GLIBCXX_VERSION) && !defined(_GLIBCXX_RELEASE) +// The version is explicitly specified in our public RANDOM_ITERATOR_TBB_USE_GLIBCXX_VERSION macro. +// Its format should match the __RANDOM_ITERATOR_TBB_GCC_VERSION above, e.g. 70301 for libstdc++ coming with GCC 7.3.1. +#define __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION RANDOM_ITERATOR_TBB_USE_GLIBCXX_VERSION +#elif _GLIBCXX_RELEASE && _GLIBCXX_RELEASE != __GNUC__ +// Reported versions of GCC and libstdc++ do not match; trust the latter +#define __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION (_GLIBCXX_RELEASE*10000) +#elif __GLIBCPP__ || __GLIBCXX__ +// The version macro is not defined or matches the GCC version; use __RANDOM_ITERATOR_TBB_GCC_VERSION +#define __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION __RANDOM_ITERATOR_TBB_GCC_VERSION +#endif + +#if __clang__ + // according to clang documentation, version can be vendor specific + #define __RANDOM_ITERATOR_TBB_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) +#endif + +/** Target OS is either iOS* or iOS* simulator **/ +#if __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ + #define __RANDOM_ITERATOR_TBB_IOS 1 +#endif + +#if __APPLE__ + #if __INTEL_COMPILER && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1099 \ + && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 101000 + // ICC does not correctly set the macro if -mmacosx-min-version is not specified + #define __RANDOM_ITERATOR_TBB_MACOS_TARGET_VERSION (100000 + 10*(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 1000)) + #else + #define __RANDOM_ITERATOR_TBB_MACOS_TARGET_VERSION __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ + #endif +#endif + +/** Preprocessor symbols to determine HW architecture **/ + +#if _WIN32||_WIN64 +# if defined(_M_X64)||defined(__x86_64__) // the latter for MinGW support +# define __RANDOM_ITERATOR_TBB_x86_64 1 +# elif defined(_M_IA64) +# define __RANDOM_ITERATOR_TBB_ipf 1 +# elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support +# define __RANDOM_ITERATOR_TBB_x86_32 1 +# else +# define __RANDOM_ITERATOR_TBB_generic_arch 1 +# endif +#else /* Assume generic Unix */ +# if !__linux__ && !__APPLE__ +# define __RANDOM_ITERATOR_TBB_generic_os 1 +# endif +# if __RANDOM_ITERATOR_TBB_IOS +# define __RANDOM_ITERATOR_TBB_generic_arch 1 +# elif __x86_64__ +# define __RANDOM_ITERATOR_TBB_x86_64 1 +# elif __ia64__ +# define __RANDOM_ITERATOR_TBB_ipf 1 +# elif __i386__||__i386 // __i386 is for Sun OS +# define __RANDOM_ITERATOR_TBB_x86_32 1 +# else +# define __RANDOM_ITERATOR_TBB_generic_arch 1 +# endif +#endif + +#if __MIC__ || __MIC2__ +#define __RANDOM_ITERATOR_TBB_DEFINE_MIC 1 +#endif + +#define __RANDOM_ITERATOR_TBB_TSX_AVAILABLE ((__RANDOM_ITERATOR_TBB_x86_32 || __RANDOM_ITERATOR_TBB_x86_64) && !__RANDOM_ITERATOR_TBB_DEFINE_MIC) + +/** Presence of compiler features **/ + +#if __INTEL_COMPILER == 9999 && __INTEL_COMPILER_BUILD_DATE == 20110811 +/* Intel(R) Composer XE 2011 Update 6 incorrectly sets __INTEL_COMPILER. Fix it. */ + #undef __INTEL_COMPILER + #define __INTEL_COMPILER 1210 +#endif + +#if __clang__ && !__INTEL_COMPILER +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_OPTIONAL_RTTI __has_feature(cxx_rtti) +#elif defined(_CPPRTTI) +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_OPTIONAL_RTTI 1 +#else +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_OPTIONAL_RTTI (__GXX_RTTI || __RTTI || __INTEL_RTTI__) +#endif + +#if __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400 && !defined(__INTEL_COMPILER) + /** warning suppression pragmas available in GCC since 4.4 **/ + #define __RANDOM_ITERATOR_TBB_GCC_WARNING_SUPPRESSION_PRESENT 1 +#endif + +/* Select particular features of C++11 based on compiler version. + ICC 12.1 (Linux*), GCC 4.3 and higher, clang 2.9 and higher + set __GXX_EXPERIMENTAL_CXX0X__ in c++11 mode. + + Compilers that mimics other compilers (ICC, clang) must be processed before + compilers they mimic (GCC, MSVC). + + TODO: The following conditions should be extended when new compilers/runtimes + support added. + */ + +/** + __RANDOM_ITERATOR_TBB_CPP11_PRESENT macro indicates that the compiler supports vast majority of C++11 features. + Depending on the compiler, some features might still be unsupported or work incorrectly. + Use it when enabling C++11 features individually is not practical, and be aware that + some "good enough" compilers might be excluded. **/ +#define __RANDOM_ITERATOR_TBB_CPP11_PRESENT (__cplusplus >= 201103L || _MSC_VER >= 1900) + +#define __RANDOM_ITERATOR_TBB_CPP17_FALLTHROUGH_PRESENT (__cplusplus >= 201703L) +#define __RANDOM_ITERATOR_TBB_FALLTHROUGH_PRESENT (__RANDOM_ITERATOR_TBB_GCC_VERSION >= 70000 && !__INTEL_COMPILER) + +/** C++11 mode detection macros for Intel(R) C++ Compiler (enabled by -std=c++XY option): + __INTEL_CXX11_MODE__ for version >=13.0 (not available for ICC 15.0 if -std=c++14 is used), + __STDC_HOSTED__ for version >=12.0 (useful only on Windows), + __GXX_EXPERIMENTAL_CXX0X__ for version >=12.0 on Linux and macOS. **/ +#if __INTEL_COMPILER && !__INTEL_CXX11_MODE__ + // __INTEL_CXX11_MODE__ is not set, try to deduce it + #define __INTEL_CXX11_MODE__ (__GXX_EXPERIMENTAL_CXX0X__ || (_MSC_VER && __STDC_HOSTED__)) +#endif + +#if __INTEL_COMPILER && (!_MSC_VER || __INTEL_CXX11_MODE__) + // On Windows, C++11 features supported by Visual Studio 2010 and higher are enabled by default, + // so in absence of /Qstd= use MSVC branch for feature detection. + // On other platforms, no -std= means C++03. + + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT (__INTEL_CXX11_MODE__ && __VARIADIC_TEMPLATES) + // Both r-value reference support in compiler and std::move/std::forward + // presence in C++ standard library is checked. + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT ((_MSC_VER >= 1700 || __GXX_EXPERIMENTAL_CXX0X__ && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40500 || _LIBCPP_VERSION)) && __INTEL_COMPILER >= 1400) + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400 && (_MSC_VER >= 1900 || __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40600 || __clang__)) + #if _MSC_VER >= 1600 + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT ( __INTEL_COMPILER > 1300 \ + /*ICC 12.1 Upd 10 and 13 beta Upd 2 fixed exception_ptr linking issue*/ \ + || (__INTEL_COMPILER == 1300 && __INTEL_COMPILER_BUILD_DATE >= 20120530) \ + || (__INTEL_COMPILER == 1210 && __INTEL_COMPILER_BUILD_DATE >= 20120410) ) + /** libstdc++ that comes with GCC 4.6 use C++11 features not supported by ICC 12.1. + * Because of that ICC 12.1 does not support C++11 mode with gcc 4.6 (or higher), + * and therefore does not define __GXX_EXPERIMENTAL_CXX0X__ macro **/ + #elif __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40404 && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION < 40600 + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1200) + #elif __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1300) + #elif _LIBCPP_VERSION + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT __GXX_EXPERIMENTAL_CXX0X__ + #else + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT 0 + #endif + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT (__INTEL_CXX11_MODE__ || _MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40300 || _LIBCPP_VERSION)) + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400 && (_MSC_VER >= 1800 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40400 || _LIBCPP_VERSION)) + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400) + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1200) + /** ICC seems to disable support of noexcept event in c++11 when compiling in compatibility mode for gcc <4.6 **/ + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1300 && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 || _LIBCPP_VERSION || _MSC_VER)) + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT (_MSC_VER >= 1700 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1310 && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 || _LIBCPP_VERSION)) + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210) + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210) + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1200) + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT (_MSC_VER >= 1800 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210) + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400) + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1500) + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT (__INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1210) + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__INTEL_COMPILER > 1910) // a future version + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (__cplusplus >= 201703L) +#elif __clang__ +/** TODO: these options need to be rechecked **/ + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __has_feature(__cxx_variadic_templates__) + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT (__has_feature(__cxx_rvalue_references__) && (_LIBCPP_VERSION || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40500)) + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT __has_feature(cxx_implicit_moves) +/** TODO: extend exception_ptr related conditions to cover libstdc++ **/ + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (__cplusplus >= 201103L && (_LIBCPP_VERSION || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600)) + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT __has_feature(__cxx_static_assert__) + #if (__cplusplus >= 201103L && __has_include(<tuple>)) + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT 1 + #endif + #if (__has_feature(__cxx_generalized_initializers__) && __has_include(<initializer_list>)) + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT 1 + #endif + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT __has_feature(__cxx_constexpr__) + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__has_feature(__cxx_defaulted_functions__) && __has_feature(__cxx_deleted_functions__)) + /**For some unknown reason __has_feature(__cxx_noexcept) does not yield true for all cases. Compiler bug ? **/ + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT (__cplusplus >= 201103L) + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT (__has_feature(__cxx_range_for__) && (_LIBCPP_VERSION || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600)) + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT __has_feature(__cxx_auto_type__) + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT __has_feature(__cxx_decltype__) + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT __has_feature(cxx_lambdas) + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT __has_feature(cxx_default_function_template_args) + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT __has_feature(cxx_override_control) + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT __has_feature(cxx_alignas) + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT __has_feature(cxx_alias_templates) + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__has_feature(cxx_variable_templates)) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__has_feature(__cpp_deduction_guides)) + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (__has_feature(__cpp_lib_is_invocable)) +#elif __GNUC__ + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __GXX_EXPERIMENTAL_CXX0X__ + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40700) + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40500) + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40600) + /** __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 here is a substitution for _GLIBCXX_ATOMIC_BUILTINS_4, which is a prerequisite + for exception_ptr but cannot be used in this file because it is defined in a header, not by the compiler. + If the compiler has no atomic intrinsics, the C++ library should not expect those as well. **/ + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40404 && __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40300) + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40300) + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + /** gcc seems have to support constexpr from 4.4 but tests in (test_atomic) seeming reasonable fail to compile prior 4.6**/ + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40600) + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40600) + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40400) + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40500) + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40300) + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40700) + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40800) + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40700) + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 50000) + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__cplusplus >= 201402L && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 50000) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__cpp_deduction_guides >= 201606L) + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (__cplusplus >= 201703L && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 70000) +#elif _MSC_VER + // These definitions are also used with Intel C++ Compiler in "default" mode (__INTEL_CXX11_MODE__ == 0); + // see a comment in "__INTEL_COMPILER" section above. + + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT (_MSC_VER >= 1800) + // Contains a workaround for ICC 13 + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT (_MSC_VER >= 1700 && (!__INTEL_COMPILER || __INTEL_COMPILER >= 1400)) + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT (_MSC_VER >= 1900) + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT (_MSC_VER >= 1800) + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT (_MSC_VER >= 1900) + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT (_MSC_VER >= 1800) + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT (_MSC_VER >= 1900) + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT (_MSC_VER >= 1700) + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT (_MSC_VER >= 1600) + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT (_MSC_VER >= 1800) + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT (_MSC_VER >= 1700) + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT (_MSC_VER >= 1900) + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT (_MSC_VER >= 1800) + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (_MSC_VER >= 1900) + /* Variable templates are supported in VS2015 Update 2 or later */ + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (_MSC_FULL_VER >= 190023918 && (!__INTEL_COMPILER || __INTEL_COMPILER >= 1700)) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (_MSVC_LANG >= 201703L && _MSC_VER >= 1914) + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (_MSVC_LANG >= 201703L && _MSC_VER >= 1911) +#else + #define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_TUPLE_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_STD_BEGIN_END_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_ALIGNAS_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT __RANDOM_ITERATOR_TBB_CPP11_PRESENT + #define __RANDOM_ITERATOR_TBB_CPP14_INTEGER_SEQUENCE_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP14_VARIABLE_TEMPLATES_PRESENT (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_CPP17_DEDUCTION_GUIDES_PRESENT (__cplusplus >= 201703L) + #define __RANDOM_ITERATOR_TBB_CPP17_INVOKE_RESULT_PRESENT (__cplusplus >= 201703L) +#endif + +// C++11 standard library features + +#define __RANDOM_ITERATOR_TBB_CPP11_ARRAY_PRESENT (_MSC_VER >= 1700 || _LIBCPP_VERSION || __GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40300) + +#ifndef __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT +#define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT +#endif +#define __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TUPLE_PRESENT (!_MSC_VER || _MSC_VER >= 1800) + +#define __RANDOM_ITERATOR_TBB_CPP11_TYPE_PROPERTIES_PRESENT (_LIBCPP_VERSION || _MSC_VER >= 1700 || (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 50000 && __GXX_EXPERIMENTAL_CXX0X__)) +// GCC supported some of type properties since 4.7 +#define __RANDOM_ITERATOR_TBB_CPP11_IS_COPY_CONSTRUCTIBLE_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40700 || __RANDOM_ITERATOR_TBB_CPP11_TYPE_PROPERTIES_PRESENT) + +// In GCC, std::move_if_noexcept appeared later than noexcept +#define __RANDOM_ITERATOR_TBB_MOVE_IF_NOEXCEPT_PRESENT (__RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40700 || _MSC_VER >= 1900 || _LIBCPP_VERSION)) +#define __RANDOM_ITERATOR_TBB_ALLOCATOR_TRAITS_PRESENT (__cplusplus >= 201103L && _LIBCPP_VERSION || _MSC_VER >= 1800 || \ + __GXX_EXPERIMENTAL_CXX0X__ && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40700 && !(__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION == 40700 && __RANDOM_ITERATOR_TBB_DEFINE_MIC)) +#define __RANDOM_ITERATOR_TBB_MAKE_EXCEPTION_PTR_PRESENT (__RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT && (_MSC_VER >= 1700 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 || _LIBCPP_VERSION || __SUNPRO_CC)) + +// Due to libc++ limitations in C++03 mode, do not pass rvalues to std::make_shared() +#define __RANDOM_ITERATOR_TBB_CPP11_SMART_POINTERS_PRESENT ( _MSC_VER >= 1600 || _LIBCPP_VERSION \ + || ((__cplusplus >= 201103L || __GXX_EXPERIMENTAL_CXX0X__) \ + && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40500 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40400 && __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_OPTIONAL_RTTI)) ) + +#define __RANDOM_ITERATOR_TBB_CPP11_FUTURE_PRESENT (_MSC_VER >= 1700 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40600 && __GXX_EXPERIMENTAL_CXX0X__ || _LIBCPP_VERSION) + +#define __RANDOM_ITERATOR_TBB_CPP11_GET_NEW_HANDLER_PRESENT (_MSC_VER >= 1900 || __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION >= 40900 && __GXX_EXPERIMENTAL_CXX0X__ || _LIBCPP_VERSION) + +#define __RANDOM_ITERATOR_TBB_CPP17_UNCAUGHT_EXCEPTIONS_PRESENT (_MSC_VER >= 1900 || __GLIBCXX__ && __cpp_lib_uncaught_exceptions \ + || _LIBCPP_VERSION >= 3700 && (!__RANDOM_ITERATOR_TBB_MACOS_TARGET_VERSION || __RANDOM_ITERATOR_TBB_MACOS_TARGET_VERSION >= 101200)) +// TODO: wait when memory_resource will be fully supported in clang and define the right macro +// Currently it is in experimental stage since 6 version. +#define __RANDOM_ITERATOR_TBB_CPP17_MEMORY_RESOURCE_PRESENT (_MSC_VER >= 1913 && (_MSVC_LANG > 201402L || __cplusplus > 201402L) || \ + __GLIBCXX__ && __cpp_lib_memory_resource >= 201603) +#define __RANDOM_ITERATOR_TBB_CPP17_HW_INTERFERENCE_SIZE_PRESENT (_MSC_VER >= 1911) +// std::swap is in <utility> only since C++11, though MSVC had it at least since VS2005 +#if _MSC_VER>=1400 || _LIBCPP_VERSION || __GXX_EXPERIMENTAL_CXX0X__ +#define __RANDOM_ITERATOR_TBB_STD_SWAP_HEADER <utility> +#else +#define __RANDOM_ITERATOR_TBB_STD_SWAP_HEADER <algorithm> +#endif + +//TODO: not clear how exactly this macro affects exception_ptr - investigate +// On linux ICC fails to find existing std::exception_ptr in libstdc++ without this define +#if __INTEL_COMPILER && __GNUC__ && __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) + #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 +#endif + +// Work around a bug in MinGW32 +#if __MINGW32__ && __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT && !defined(_GLIBCXX_ATOMIC_BUILTINS_4) + #define _GLIBCXX_ATOMIC_BUILTINS_4 +#endif + +#if __GNUC__ || __SUNPRO_CC || __IBMCPP__ + /* ICC defines __GNUC__ and so is covered */ + #define __RANDOM_ITERATOR_TBB_ATTRIBUTE_ALIGNED_PRESENT 1 +#elif _MSC_VER && (_MSC_VER >= 1300 || __INTEL_COMPILER) + #define __RANDOM_ITERATOR_TBB_DECLSPEC_ALIGN_PRESENT 1 +#endif + +/* Actually ICC supports gcc __sync_* intrinsics starting 11.1, + * but 64 bit support for 32 bit target comes in later ones*/ +/* TODO: change the version back to 4.1.2 once macro __RANDOM_ITERATOR_TBB_WORD_SIZE become optional */ +/* Assumed that all clang versions have these gcc compatible intrinsics. */ +#if __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40306 || __INTEL_COMPILER >= 1200 || __clang__ + /** built-in atomics available in GCC since 4.1.2 **/ + #define __RANDOM_ITERATOR_TBB_GCC_BUILTIN_ATOMICS_PRESENT 1 +#endif + +#if __RANDOM_ITERATOR_TBB_GCC_VERSION >= 70000 && !__INTEL_COMPILER && !__clang__ + // After GCC7 there was possible reordering problem in generic atomic load/store operations. + // So always using builtins. + #define RANDOM_ITERATOR_TBB_USE_GCC_BUILTINS 1 +#endif + +#if __INTEL_COMPILER >= 1200 + /** built-in C++11 style atomics available in ICC since 12.0 **/ + #define __RANDOM_ITERATOR_TBB_ICC_BUILTIN_ATOMICS_PRESENT 1 +#endif + +#if _MSC_VER>=1600 && (!__INTEL_COMPILER || __INTEL_COMPILER>=1310) + #define __RANDOM_ITERATOR_TBB_MSVC_PART_WORD_INTERLOCKED_INTRINSICS_PRESENT 1 +#endif + +#define __RANDOM_ITERATOR_TBB_TSX_INTRINSICS_PRESENT ((__RTM__ || _MSC_VER>=1700 || __INTEL_COMPILER>=1300) && !__RANDOM_ITERATOR_TBB_DEFINE_MIC && !__ANDROID__) + +/** Macro helpers **/ +#define __RANDOM_ITERATOR_TBB_CONCAT_AUX(A,B) A##B +// The additional level of indirection is needed to expand macros A and B (not to get the AB macro). +// See [cpp.subst] and [cpp.concat] for more details. +#define __RANDOM_ITERATOR_TBB_CONCAT(A,B) __RANDOM_ITERATOR_TBB_CONCAT_AUX(A,B) +// The IGNORED argument and comma are needed to always have 2 arguments (even when A is empty). +#define __RANDOM_ITERATOR_TBB_IS_MACRO_EMPTY(A,IGNORED) __RANDOM_ITERATOR_TBB_CONCAT_AUX(__RANDOM_ITERATOR_TBB_MACRO_EMPTY,A) +#define __RANDOM_ITERATOR_TBB_MACRO_EMPTY 1 + +/** User controlled TBB features & modes **/ +#ifndef RANDOM_ITERATOR_TBB_USE_DEBUG +/* +There are four cases that are supported: + 1. "_DEBUG is undefined" means "no debug"; + 2. "_DEBUG defined to something that is evaluated to 0" (including "garbage", as per [cpp.cond]) means "no debug"; + 3. "_DEBUG defined to something that is evaluated to a non-zero value" means "debug"; + 4. "_DEBUG defined to nothing (empty)" means "debug". +*/ +#ifdef _DEBUG +// Check if _DEBUG is empty. +#define __RANDOM_ITERATOR_TBB_IS__DEBUG_EMPTY (__RANDOM_ITERATOR_TBB_IS_MACRO_EMPTY(_DEBUG,IGNORED)==__RANDOM_ITERATOR_TBB_MACRO_EMPTY) +#if __RANDOM_ITERATOR_TBB_IS__DEBUG_EMPTY +#define RANDOM_ITERATOR_TBB_USE_DEBUG 1 +#else +#define RANDOM_ITERATOR_TBB_USE_DEBUG _DEBUG +#endif /* __RANDOM_ITERATOR_TBB_IS__DEBUG_EMPTY */ +#else +#define RANDOM_ITERATOR_TBB_USE_DEBUG 0 +#endif +#endif /* RANDOM_ITERATOR_TBB_USE_DEBUG */ + +#ifndef RANDOM_ITERATOR_TBB_USE_ASSERT +#define RANDOM_ITERATOR_TBB_USE_ASSERT RANDOM_ITERATOR_TBB_USE_DEBUG +#endif /* RANDOM_ITERATOR_TBB_USE_ASSERT */ + +#ifndef RANDOM_ITERATOR_TBB_USE_THREADING_TOOLS +#define RANDOM_ITERATOR_TBB_USE_THREADING_TOOLS RANDOM_ITERATOR_TBB_USE_DEBUG +#endif /* RANDOM_ITERATOR_TBB_USE_THREADING_TOOLS */ + +#ifndef RANDOM_ITERATOR_TBB_USE_PERFORMANCE_WARNINGS +#ifdef RANDOM_ITERATOR_TBB_PERFORMANCE_WARNINGS +#define RANDOM_ITERATOR_TBB_USE_PERFORMANCE_WARNINGS RANDOM_ITERATOR_TBB_PERFORMANCE_WARNINGS +#else +#define RANDOM_ITERATOR_TBB_USE_PERFORMANCE_WARNINGS RANDOM_ITERATOR_TBB_USE_DEBUG +#endif /* RANDOM_ITERATOR_TBB_PERFORMANCE_WARNINGS */ +#endif /* RANDOM_ITERATOR_TBB_USE_PERFORMANCE_WARNINGS */ + +#if __RANDOM_ITERATOR_TBB_DEFINE_MIC + #if RANDOM_ITERATOR_TBB_USE_EXCEPTIONS + #error The platform does not properly support exception handling. Please do not set RANDOM_ITERATOR_TBB_USE_EXCEPTIONS macro or set it to 0. + #elif !defined(RANDOM_ITERATOR_TBB_USE_EXCEPTIONS) + #define RANDOM_ITERATOR_TBB_USE_EXCEPTIONS 0 + #endif +#elif !(__EXCEPTIONS || defined(_CPPUNWIND) || __SUNPRO_CC) + #if RANDOM_ITERATOR_TBB_USE_EXCEPTIONS + #error Compilation settings do not support exception handling. Please do not set RANDOM_ITERATOR_TBB_USE_EXCEPTIONS macro or set it to 0. + #elif !defined(RANDOM_ITERATOR_TBB_USE_EXCEPTIONS) + #define RANDOM_ITERATOR_TBB_USE_EXCEPTIONS 0 + #endif +#elif !defined(RANDOM_ITERATOR_TBB_USE_EXCEPTIONS) + #define RANDOM_ITERATOR_TBB_USE_EXCEPTIONS 1 +#endif + +#ifndef RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X +/** By default, use C++11 classes if available **/ + #if __clang__ + /* Old versions of Intel C++ Compiler do not have __has_include or cannot use it in #define */ + #if (__INTEL_COMPILER && (__INTEL_COMPILER < 1500 || __INTEL_COMPILER == 1500 && __INTEL_COMPILER_UPDATE <= 1)) + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (__cplusplus < 201103L || !_LIBCPP_VERSION) + #else + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (__cplusplus < 201103L || (!__has_include(<thread>) && !__has_include(<condition_variable>))) + #endif + #elif __GNUC__ + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (__RANDOM_ITERATOR_TBB_GCC_VERSION < 40400 || !__GXX_EXPERIMENTAL_CXX0X__) + #elif _MSC_VER + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (_MSC_VER < 1700) + #else + // TODO: Reconsider general approach to be more reliable, e.g. (!(__cplusplus >= 201103L && __ STDC_HOSTED__)) + #define RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X (!__STDCPP_THREADS__) + #endif +#endif /* RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X */ + +/* RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION should be explicitly set to either 0 or 1, as it is used as C++ const */ +#ifndef RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION + /** IA-64 architecture pre-built TBB binaries do not support exception_ptr. **/ + #if __RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT && !defined(__ia64__) + #define RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION 0 + #else + #define RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION 1 + #endif +#else /* defined RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION */ + #if !RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION && !__RANDOM_ITERATOR_TBB_EXCEPTION_PTR_PRESENT + #error Current runtime does not support std::exception_ptr. Set RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception. + #endif +#endif /* defined RANDOM_ITERATOR_TBB_USE_CAPTURED_EXCEPTION */ + +/** Check whether the request to use GCC atomics can be satisfied **/ +#if RANDOM_ITERATOR_TBB_USE_GCC_BUILTINS && !__RANDOM_ITERATOR_TBB_GCC_BUILTIN_ATOMICS_PRESENT + #error "GCC atomic built-ins are not supported." +#endif + +/** Internal TBB features & modes **/ + +/** __RANDOM_ITERATOR_TBB_CONCURRENT_ORDERED_CONTAINERS indicates that all conditions of use + * concurrent_map and concurrent_set are met. **/ +// TODO: Add cpp11 random generation macro +#ifndef __RANDOM_ITERATOR_TBB_CONCURRENT_ORDERED_CONTAINERS_PRESENT + #define __RANDOM_ITERATOR_TBB_CONCURRENT_ORDERED_CONTAINERS_PRESENT ( __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT \ + && __RANDOM_ITERATOR_TBB_IMPLICIT_MOVE_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_LAMBDAS_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_ARRAY_PRESENT \ + && __RANDOM_ITERATOR_TBB_INITIALIZER_LISTS_PRESENT ) +#endif + +/** __RANDOM_ITERATOR_TBB_WEAK_SYMBOLS_PRESENT denotes that the system supports the weak symbol mechanism **/ +#ifndef __RANDOM_ITERATOR_TBB_WEAK_SYMBOLS_PRESENT +#define __RANDOM_ITERATOR_TBB_WEAK_SYMBOLS_PRESENT ( !_WIN32 && !__APPLE__ && !__sun && (__RANDOM_ITERATOR_TBB_GCC_VERSION >= 40000 || __INTEL_COMPILER ) ) +#endif + +/** __RANDOM_ITERATOR_TBB_DYNAMIC_LOAD_ENABLED describes the system possibility to load shared libraries at run time **/ +#ifndef __RANDOM_ITERATOR_TBB_DYNAMIC_LOAD_ENABLED + #define __RANDOM_ITERATOR_TBB_DYNAMIC_LOAD_ENABLED 1 +#endif + +/** __RANDOM_ITERATOR_TBB_SOURCE_DIRECTLY_INCLUDED is a mode used in whitebox testing when + it's necessary to test internal functions not exported from TBB DLLs +**/ +#if (_WIN32||_WIN64) && (__RANDOM_ITERATOR_TBB_SOURCE_DIRECTLY_INCLUDED || RANDOM_ITERATOR_TBB_USE_PREVIEW_BINARY) + #define __RANDOM_ITERATOR_TBB_NO_IMPLICIT_LINKAGE 1 + #define __RANDOM_ITERATOR_TBBMALLOC_NO_IMPLICIT_LINKAGE 1 +#endif + +#ifndef __RANDOM_ITERATOR_TBB_COUNT_TASK_NODES + #define __RANDOM_ITERATOR_TBB_COUNT_TASK_NODES RANDOM_ITERATOR_TBB_USE_ASSERT +#endif + +#ifndef __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT + #define __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT 1 +#endif /* __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT */ + +#ifndef __RANDOM_ITERATOR_TBB_SCHEDULER_OBSERVER + #define __RANDOM_ITERATOR_TBB_SCHEDULER_OBSERVER 1 +#endif /* __RANDOM_ITERATOR_TBB_SCHEDULER_OBSERVER */ + +#ifndef __RANDOM_ITERATOR_TBB_FP_CONTEXT + #define __RANDOM_ITERATOR_TBB_FP_CONTEXT __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT +#endif /* __RANDOM_ITERATOR_TBB_FP_CONTEXT */ + +#if __RANDOM_ITERATOR_TBB_FP_CONTEXT && !__RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT + #error __RANDOM_ITERATOR_TBB_FP_CONTEXT requires __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT to be enabled +#endif + +#define __RANDOM_ITERATOR_TBB_RECYCLE_TO_ENQUEUE __RANDOM_ITERATOR_TBB_BUILD // keep non-official + +#ifndef __RANDOM_ITERATOR_TBB_ARENA_OBSERVER + #define __RANDOM_ITERATOR_TBB_ARENA_OBSERVER __RANDOM_ITERATOR_TBB_SCHEDULER_OBSERVER +#endif /* __RANDOM_ITERATOR_TBB_ARENA_OBSERVER */ + +#ifndef __RANDOM_ITERATOR_TBB_TASK_ISOLATION + #define __RANDOM_ITERATOR_TBB_TASK_ISOLATION 1 +#endif /* __RANDOM_ITERATOR_TBB_TASK_ISOLATION */ + +#if RANDOM_ITERATOR_TBB_USE_EXCEPTIONS && !__RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT + #error RANDOM_ITERATOR_TBB_USE_EXCEPTIONS requires __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT to be enabled +#endif + +#ifndef __RANDOM_ITERATOR_TBB_TASK_PRIORITY + #define __RANDOM_ITERATOR_TBB_TASK_PRIORITY (__RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT) +#endif /* __RANDOM_ITERATOR_TBB_TASK_PRIORITY */ + +#if __RANDOM_ITERATOR_TBB_TASK_PRIORITY && !__RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT + #error __RANDOM_ITERATOR_TBB_TASK_PRIORITY requires __RANDOM_ITERATOR_TBB_TASK_GROUP_CONTEXT to be enabled +#endif + +#if RANDOM_ITERATOR_TBB_PREVIEW_NUMA_SUPPORT || __RANDOM_ITERATOR_TBB_BUILD + #define __RANDOM_ITERATOR_TBB_NUMA_SUPPORT 1 +#endif + +#if RANDOM_ITERATOR_TBB_PREVIEW_WAITING_FOR_WORKERS || __RANDOM_ITERATOR_TBB_BUILD + #define __RANDOM_ITERATOR_TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE 1 +#endif + +#ifndef __RANDOM_ITERATOR_TBB_ENQUEUE_ENFORCED_CONCURRENCY + #define __RANDOM_ITERATOR_TBB_ENQUEUE_ENFORCED_CONCURRENCY 1 +#endif + +#if !defined(__RANDOM_ITERATOR_TBB_SURVIVE_THREAD_SWITCH) && \ + (_WIN32 || _WIN64 || __APPLE__ || (__linux__ && !__ANDROID__)) + #define __RANDOM_ITERATOR_TBB_SURVIVE_THREAD_SWITCH 1 +#endif /* __RANDOM_ITERATOR_TBB_SURVIVE_THREAD_SWITCH */ + +#ifndef __RANDOM_ITERATOR_TBB_DEFAULT_PARTITIONER +#define __RANDOM_ITERATOR_TBB_DEFAULT_PARTITIONER tbb::auto_partitioner +#endif + +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES 1 +#endif + +#ifndef __RANDOM_ITERATOR_TBB_ENABLE_RANGE_FEEDBACK +#define __RANDOM_ITERATOR_TBB_ENABLE_RANGE_FEEDBACK 0 +#endif + +#ifdef _VARIADIC_MAX + #define __RANDOM_ITERATOR_TBB_VARIADIC_MAX _VARIADIC_MAX +#else + #if _MSC_VER == 1700 + #define __RANDOM_ITERATOR_TBB_VARIADIC_MAX 5 // VS11 setting, issue resolved in VS12 + #elif _MSC_VER == 1600 + #define __RANDOM_ITERATOR_TBB_VARIADIC_MAX 10 // VS10 setting + #else + #define __RANDOM_ITERATOR_TBB_VARIADIC_MAX 15 + #endif +#endif + +// Intel C++ Compiler starts analyzing usages of the deprecated content at the template +// instantiation site, which is too late for suppression of the corresponding messages for internal +// stuff. +#if !defined(__INTEL_COMPILER) && (!defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) || (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0)) + #if (__cplusplus >= 201402L) + #define __RANDOM_ITERATOR_TBB_DEPRECATED [[deprecated]] + #define __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) [[deprecated(msg)]] + #elif _MSC_VER + #define __RANDOM_ITERATOR_TBB_DEPRECATED __declspec(deprecated) + #define __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) __declspec(deprecated(msg)) + #elif (__GNUC__ && __RANDOM_ITERATOR_TBB_GCC_VERSION >= 40805) || __clang__ + #define __RANDOM_ITERATOR_TBB_DEPRECATED __attribute__((deprecated)) + #define __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) __attribute__((deprecated(msg))) + #endif +#endif // !defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) || (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0) + +#if !defined(__RANDOM_ITERATOR_TBB_DEPRECATED) + #define __RANDOM_ITERATOR_TBB_DEPRECATED + #define __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) +#elif !defined(__RANDOM_ITERATOR_TBB_SUPPRESS_INTERNAL_DEPRECATED_MESSAGES) + // Suppress deprecated messages from self + #define __RANDOM_ITERATOR_TBB_SUPPRESS_INTERNAL_DEPRECATED_MESSAGES 1 +#endif + +#if defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) && (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0) + #define __RANDOM_ITERATOR_TBB_DEPRECATED_IN_VERBOSE_MODE __RANDOM_ITERATOR_TBB_DEPRECATED + #define __RANDOM_ITERATOR_TBB_DEPRECATED_IN_VERBOSE_MODE_MSG(msg) __RANDOM_ITERATOR_TBB_DEPRECATED_MSG(msg) +#else + #define __RANDOM_ITERATOR_TBB_DEPRECATED_IN_VERBOSE_MODE + #define __RANDOM_ITERATOR_TBB_DEPRECATED_IN_VERBOSE_MODE_MSG(msg) +#endif // (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0) + +#if (!defined(TBB_SUPPRESS_DEPRECATED_MESSAGES) || (TBB_SUPPRESS_DEPRECATED_MESSAGES == 0)) && !__RANDOM_ITERATOR_TBB_CPP11_PRESENT + #pragma message("TBB Warning: Support for C++98/03 is deprecated. Please use the compiler that supports C++11 features at least.") +#endif + +/** __RANDOM_ITERATOR_TBB_WIN8UI_SUPPORT enables support of Windows* Store Apps and limit a possibility to load + shared libraries at run time only from application container **/ +// TODO: Separate this single macro into two for Windows 8 Store* (win8ui mode) and UWP/UWD modes. +#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP + #define __RANDOM_ITERATOR_TBB_WIN8UI_SUPPORT 1 +#else + #define __RANDOM_ITERATOR_TBB_WIN8UI_SUPPORT 0 +#endif + +/** Macros of the form __RANDOM_ITERATOR_TBB_XXX_BROKEN denote known issues that are caused by + the bugs in compilers, standard or OS specific libraries. They should be + removed as soon as the corresponding bugs are fixed or the buggy OS/compiler + versions go out of the support list. +**/ + +#if __SIZEOF_POINTER__ < 8 && __ANDROID__ && __RANDOM_ITERATOR_TBB_GCC_VERSION <= 40403 && !__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 + /** Necessary because on Android 8-byte CAS and F&A are not available for some processor architectures, + but no mandatory warning message appears from GCC 4.4.3. Instead, only a linkage error occurs when + these atomic operations are used (such as in unit test test_atomic.exe). **/ + #define __RANDOM_ITERATOR_TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 1 +#elif __RANDOM_ITERATOR_TBB_x86_32 && __RANDOM_ITERATOR_TBB_GCC_VERSION == 40102 && ! __GNUC_RH_RELEASE__ + /** GCC 4.1.2 erroneously emit call to external function for 64 bit sync_ intrinsics. + However these functions are not defined anywhere. It seems that this problem was fixed later on + and RHEL got an updated version of gcc 4.1.2. **/ + #define __RANDOM_ITERATOR_TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 1 +#endif + +#if __GNUC__ && __RANDOM_ITERATOR_TBB_x86_64 && __INTEL_COMPILER == 1200 + #define __RANDOM_ITERATOR_TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN 1 +#endif + +#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012) + /** Necessary to avoid ICL error (or warning in non-strict mode): + "exception specification for implicitly declared virtual destructor is + incompatible with that of overridden one". **/ + #define __RANDOM_ITERATOR_TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1 +#endif + +#if !__INTEL_COMPILER && (_MSC_VER && _MSC_VER < 1500 || __GNUC__ && __RANDOM_ITERATOR_TBB_GCC_VERSION < 40102) + /** gcc 3.4.6 (and earlier) and VS2005 (and earlier) do not allow declaring template class as a friend + of classes defined in other namespaces. **/ + #define __RANDOM_ITERATOR_TBB_TEMPLATE_FRIENDS_BROKEN 1 +#endif + +#if __GLIBC__==2 && __GLIBC_MINOR__==3 || (__APPLE__ && ( __INTEL_COMPILER==1200 && !RANDOM_ITERATOR_TBB_USE_DEBUG)) + /** Macro controlling EH usages in TBB tests. + Some older versions of glibc crash when exception handling happens concurrently. **/ + #define __RANDOM_ITERATOR_TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1 +#endif + +#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110 + /** That's a bug in Intel C++ Compiler 11.1.044/IA-32 architecture/Windows* OS, that leads to a worker thread crash on the thread's startup. **/ + #define __RANDOM_ITERATOR_TBB_ICL_11_1_CODE_GEN_BROKEN 1 +#endif + +#if __clang__ || (__GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER)) + /** Bugs with access to nested classes declared in protected area */ + #define __RANDOM_ITERATOR_TBB_PROTECTED_NESTED_CLASS_BROKEN 1 +#endif + +#if __MINGW32__ && __RANDOM_ITERATOR_TBB_GCC_VERSION < 40200 + /** MinGW has a bug with stack alignment for routines invoked from MS RTLs. + Since GCC 4.2, the bug can be worked around via a special attribute. **/ + #define __RANDOM_ITERATOR_TBB_SSE_STACK_ALIGNMENT_BROKEN 1 +#endif + +#if __RANDOM_ITERATOR_TBB_GCC_VERSION==40300 && !__INTEL_COMPILER && !__clang__ + /* GCC of this version may rashly ignore control dependencies */ + #define __RANDOM_ITERATOR_TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1 +#endif + +#if __FreeBSD__ + /** A bug in FreeBSD 8.0 results in kernel panic when there is contention + on a mutex created with this attribute. **/ + #define __RANDOM_ITERATOR_TBB_PRIO_INHERIT_BROKEN 1 + + /** A bug in FreeBSD 8.0 results in test hanging when an exception occurs + during (concurrent?) object construction by means of placement new operator. **/ + #define __RANDOM_ITERATOR_TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1 +#endif /* __FreeBSD__ */ + +#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER) + /** The Intel C++ Compiler for IA-32 architecture (Linux* OS|macOS) crashes or generates + incorrect code when __asm__ arguments have a cast to volatile. **/ + #define __RANDOM_ITERATOR_TBB_ICC_ASM_VOLATILE_BROKEN 1 +#endif + +#if !__INTEL_COMPILER && (_MSC_VER && _MSC_VER < 1700 || __GNUC__==3 && __GNUC_MINOR__<=2) + /** Bug in GCC 3.2 and MSVC compilers that sometimes return 0 for __alignof(T) + when T has not yet been instantiated. **/ + #define __RANDOM_ITERATOR_TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1 +#endif + +#if __RANDOM_ITERATOR_TBB_DEFINE_MIC + /** Main thread and user's thread have different default thread affinity masks. **/ + #define __RANDOM_ITERATOR_TBB_MAIN_THREAD_AFFINITY_BROKEN 1 +#endif + +#if __GXX_EXPERIMENTAL_CXX0X__ && !defined(__EXCEPTIONS) && \ + ((!__INTEL_COMPILER && !__clang__ && (__RANDOM_ITERATOR_TBB_GCC_VERSION>=40400 && __RANDOM_ITERATOR_TBB_GCC_VERSION<40600)) || \ + (__INTEL_COMPILER<=1400 && (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION>=40400 && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION<=40801))) +/* There is an issue for specific GCC toolchain when C++11 is enabled + and exceptions are disabled: + exceprion_ptr.h/nested_exception.h use throw unconditionally. + GCC can ignore 'throw' since 4.6; but with ICC the issue still exists. + */ + #define __RANDOM_ITERATOR_TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN 1 +#endif + +#if __INTEL_COMPILER==1300 && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION>=40700 && defined(__GXX_EXPERIMENTAL_CXX0X__) +/* Some C++11 features used inside libstdc++ are not supported by Intel C++ Compiler. */ + #define __RANDOM_ITERATOR_TBB_ICC_13_0_CPP11_STDLIB_SUPPORT_BROKEN 1 +#endif + +#if (__GNUC__==4 && __GNUC_MINOR__==4 ) && !defined(__INTEL_COMPILER) && !defined(__clang__) + /** excessive warnings related to strict aliasing rules in GCC 4.4 **/ + #define __RANDOM_ITERATOR_TBB_GCC_STRICT_ALIASING_BROKEN 1 + /* topical remedy: #pragma GCC diagnostic ignored "-Wstrict-aliasing" */ + #if !__RANDOM_ITERATOR_TBB_GCC_WARNING_SUPPRESSION_PRESENT + #error Warning suppression is not supported, while should. + #endif +#endif + +/* In a PIC mode some versions of GCC 4.1.2 generate incorrect inlined code for 8 byte __sync_val_compare_and_swap intrinsic */ +#if __RANDOM_ITERATOR_TBB_GCC_VERSION == 40102 && __PIC__ && !defined(__INTEL_COMPILER) && !defined(__clang__) + #define __RANDOM_ITERATOR_TBB_GCC_CAS8_BUILTIN_INLINING_BROKEN 1 +#endif + +#if __RANDOM_ITERATOR_TBB_x86_32 && ( __INTEL_COMPILER || (__GNUC__==5 && __GNUC_MINOR__>=2 && __GXX_EXPERIMENTAL_CXX0X__) \ + || (__GNUC__==3 && __GNUC_MINOR__==3) || (__MINGW32__ && __GNUC__==4 && __GNUC_MINOR__==5) || __SUNPRO_CC ) + // Some compilers for IA-32 architecture fail to provide 8-byte alignment of objects on the stack, + // even if the object specifies 8-byte alignment. On such platforms, the implementation + // of 64 bit atomics for IA-32 architecture (e.g. atomic<long long>) use different tactics + // depending upon whether the object is properly aligned or not. + #define __RANDOM_ITERATOR_TBB_FORCE_64BIT_ALIGNMENT_BROKEN 1 +#else + // Define to 0 explicitly because the macro is used in a compiled code of test_atomic + #define __RANDOM_ITERATOR_TBB_FORCE_64BIT_ALIGNMENT_BROKEN 0 +#endif + +#if __GNUC__ && !__INTEL_COMPILER && !__clang__ && __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && __RANDOM_ITERATOR_TBB_GCC_VERSION < 40700 + #define __RANDOM_ITERATOR_TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN 1 +#endif + +#if _MSC_VER && _MSC_VER <= 1800 && !__INTEL_COMPILER + // With MSVC, when an array is passed by const reference to a template function, + // constness from the function parameter may get propagated to the template parameter. + #define __RANDOM_ITERATOR_TBB_CONST_REF_TO_ARRAY_TEMPLATE_PARAM_BROKEN 1 +#endif + +// A compiler bug: a disabled copy constructor prevents use of the moving constructor +#define __RANDOM_ITERATOR_TBB_IF_NO_COPY_CTOR_MOVE_SEMANTICS_BROKEN (_MSC_VER && (__INTEL_COMPILER >= 1300 && __INTEL_COMPILER <= 1310) && !__INTEL_CXX11_MODE__) + +#define __RANDOM_ITERATOR_TBB_CPP11_DECLVAL_BROKEN (_MSC_VER == 1600 || (__GNUC__ && __RANDOM_ITERATOR_TBB_GCC_VERSION < 40500) ) +// Intel C++ Compiler has difficulties with copying std::pair with VC11 std::reference_wrapper being a const member +#define __RANDOM_ITERATOR_TBB_COPY_FROM_NON_CONST_REF_BROKEN (_MSC_VER == 1700 && __INTEL_COMPILER && __INTEL_COMPILER < 1600) + +// The implicit upcasting of the tuple of a reference of a derived class to a base class fails on icc 13.X if the system's gcc environment is 4.8 +// Also in gcc 4.4 standard library the implementation of the tuple<&> conversion (tuple<A&> a = tuple<B&>, B is inherited from A) is broken. +#if __GXX_EXPERIMENTAL_CXX0X__ && __GLIBCXX__ && ((__INTEL_COMPILER >=1300 && __INTEL_COMPILER <=1310 && __RANDOM_ITERATOR_TBB_GLIBCXX_VERSION>=40700) || (__RANDOM_ITERATOR_TBB_GLIBCXX_VERSION < 40500)) +#define __RANDOM_ITERATOR_TBB_UPCAST_OF_TUPLE_OF_REF_BROKEN 1 +#endif + +// In some cases decltype of a function adds a reference to a return type. +#define __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_OF_FUNCTION_RETURN_TYPE_BROKEN (_MSC_VER == 1600 && !__INTEL_COMPILER) + +// Visual Studio 2013 does not delete the copy constructor when a user-defined move constructor is provided +#if _MSC_VER && _MSC_VER <= 1800 + #define __RANDOM_ITERATOR_TBB_IMPLICIT_COPY_DELETION_BROKEN 1 +#endif + +/** End of __RANDOM_ITERATOR_TBB_XXX_BROKEN macro section **/ + +#if defined(_MSC_VER) && _MSC_VER>=1500 && !defined(__INTEL_COMPILER) + // A macro to suppress erroneous or benign "unreachable code" MSVC warning (4702) + #define __RANDOM_ITERATOR_TBB_MSVC_UNREACHABLE_CODE_IGNORED 1 +#endif + +#define __RANDOM_ITERATOR_TBB_ATOMIC_CTORS (__RANDOM_ITERATOR_TBB_CONSTEXPR_PRESENT && __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && (!__RANDOM_ITERATOR_TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN)) + +// Many OS versions (Android 4.0.[0-3] for example) need workaround for dlopen to avoid non-recursive loader lock hang +// Setting the workaround for all compile targets ($APP_PLATFORM) below Android 4.4 (android-19) +#if __ANDROID__ +#include <android/api-level.h> +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_USE_DLOPEN_REENTRANCY_WORKAROUND (__ANDROID_API__ < 19) +#endif + +#define __RANDOM_ITERATOR_TBB_ALLOCATOR_CONSTRUCT_VARIADIC (__RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT) + +#define __RANDOM_ITERATOR_TBB_VARIADIC_PARALLEL_INVOKE (RANDOM_ITERATOR_TBB_PREVIEW_VARIADIC_PARALLEL_INVOKE && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT) +#define __RANDOM_ITERATOR_TBB_FLOW_GRAPH_CPP11_FEATURES (__RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT \ + && __RANDOM_ITERATOR_TBB_CPP11_SMART_POINTERS_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_AUTO_PRESENT) \ + && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TUPLE_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_DEFAULT_FUNC_TEMPLATE_ARGS_PRESENT \ + && !__RANDOM_ITERATOR_TBB_UPCAST_OF_TUPLE_OF_REF_BROKEN +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_STREAMING_NODE (__RANDOM_ITERATOR_TBB_CPP11_VARIADIC_FIXED_LENGTH_EXP_PRESENT && __RANDOM_ITERATOR_TBB_FLOW_GRAPH_CPP11_FEATURES \ + && RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_NODES && !RANDOM_ITERATOR_TBB_IMPLEMENT_CPP0X && !__RANDOM_ITERATOR_TBB_UPCAST_OF_TUPLE_OF_REF_BROKEN) +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_OPENCL_NODE (__RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_STREAMING_NODE && __RANDOM_ITERATOR_TBB_CPP11_TEMPLATE_ALIASES_PRESENT) +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_MESSAGE_BASED_KEY_MATCHING (RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_FEATURES || __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_OPENCL_NODE) +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_ASYNC_MSG (RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_FEATURES && __RANDOM_ITERATOR_TBB_FLOW_GRAPH_CPP11_FEATURES) + + +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_PRIORITIES +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_PRIORITIES RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_FEATURES +#endif + +// This feature works only in combination with critical tasks (__RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_CRITICAL_TASKS) +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_RESUMABLE_TASKS +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_RESUMABLE_TASKS ((__RANDOM_ITERATOR_TBB_CPF_BUILD || RANDOM_ITERATOR_TBB_PREVIEW_RESUMABLE_TASKS) && !__RANDOM_ITERATOR_TBB_WIN8UI_SUPPORT && !__ANDROID__ && !__RANDOM_ITERATOR_TBB_ipf) +#endif + +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_CRITICAL_TASKS +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_CRITICAL_TASKS (__RANDOM_ITERATOR_TBB_CPF_BUILD || __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_PRIORITIES || __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_RESUMABLE_TASKS) +#endif + +#ifndef __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_NODE_SET +#define __RANDOM_ITERATOR_RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_NODE_SET (RANDOM_ITERATOR_TBB_PREVIEW_FLOW_GRAPH_FEATURES && __RANDOM_ITERATOR_TBB_CPP11_PRESENT && __RANDOM_ITERATOR_TBB_FLOW_GRAPH_CPP11_FEATURES) +#endif + +#endif /* __RANDOM_ITERATOR_TBB_tbb_config_H */ diff --git a/random_iterator/detail/tbb/tbb_stddef.h b/random_iterator/detail/tbb/tbb_stddef.h new file mode 100644 index 0000000..fa0c658 --- /dev/null +++ b/random_iterator/detail/tbb/tbb_stddef.h @@ -0,0 +1,565 @@ +/* + Copyright (c) 2005-2020 Intel Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef __RANDOM_ITERATOR_TBB_tbb_stddef_H +#define __RANDOM_ITERATOR_TBB_tbb_stddef_H + +// Marketing-driven product version +#define RANDOM_ITERATOR_TBB_VERSION_MAJOR 2020 +#define RANDOM_ITERATOR_TBB_VERSION_MINOR 3 + +// Engineering-focused interface version +#define RANDOM_ITERATOR_TBB_INTERFACE_VERSION 11103 +#define RANDOM_ITERATOR_TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000 + +// The oldest major interface version still supported +// To be used in SONAME, manifests, etc. +#define RANDOM_ITERATOR_TBB_COMPATIBLE_INTERFACE_VERSION 2 + +#define __RANDOM_ITERATOR_TBB_STRING_AUX(x) #x +#define __RANDOM_ITERATOR_TBB_STRING(x) __RANDOM_ITERATOR_TBB_STRING_AUX(x) + +// We do not need defines below for resource processing on windows +#if !defined RC_INVOKED + +// Define groups for Doxygen documentation +/** + * @defgroup algorithms Algorithms + * @defgroup containers Containers + * @defgroup memory_allocation Memory Allocation + * @defgroup synchronization Synchronization + * @defgroup timing Timing + * @defgroup task_scheduling Task Scheduling + */ + +// Simple text that is displayed on the main page of Doxygen documentation. +/** + * \mainpage Main Page + * + * Click the tabs above for information about the + * - <a href="./modules.html">Modules</a> (groups of functionality) implemented by the library + * - <a href="./annotated.html">Classes</a> provided by the library + * - <a href="./files.html">Files</a> constituting the library. + * . + * Please note that significant part of TBB functionality is implemented in the form of + * template functions, descriptions of which are not accessible on the <a href="./annotated.html">Classes</a> + * tab. Use <a href="./modules.html">Modules</a> or <a href="./namespacemembers.html">Namespace/Namespace Members</a> + * tabs to find them. + * + * Additional pieces of information can be found here + * - \subpage concepts + * . + */ + +/** \page concepts TBB concepts + + A concept is a set of requirements to a type, which are necessary and sufficient + for the type to model a particular behavior or a set of behaviors. Some concepts + are specific to a particular algorithm (e.g. algorithm body), while other ones + are common to several algorithms (e.g. range concept). + + All TBB algorithms make use of different classes implementing various concepts. + Implementation classes are supplied by the user as type arguments of template + parameters and/or as objects passed as function call arguments. The library + provides predefined implementations of some concepts (e.g. several kinds of + \ref range_req "ranges"), while other ones must always be implemented by the user. + + TBB defines a set of minimal requirements each concept must conform to. Here is + the list of different concepts hyperlinked to the corresponding requirements specifications: + - \subpage range_req + - \subpage parallel_do_body_req + - \subpage parallel_for_body_req + - \subpage parallel_reduce_body_req + - \subpage parallel_scan_body_req + - \subpage parallel_sort_iter_req +**/ + +// tbb_config.h should be included the first since it contains macro definitions used in other headers +#include "tbb_config.h" + +#if _MSC_VER >=1400 + #define __RANDOM_ITERATOR_TBB_EXPORTED_FUNC __cdecl + #define __RANDOM_ITERATOR_TBB_EXPORTED_METHOD __thiscall +#else + #define __RANDOM_ITERATOR_TBB_EXPORTED_FUNC + #define __RANDOM_ITERATOR_TBB_EXPORTED_METHOD +#endif + +#if __INTEL_COMPILER || _MSC_VER +#define __RANDOM_ITERATOR_TBB_NOINLINE(decl) __declspec(noinline) decl +#elif __GNUC__ +#define __RANDOM_ITERATOR_TBB_NOINLINE(decl) decl __attribute__ ((noinline)) +#else +#define __RANDOM_ITERATOR_TBB_NOINLINE(decl) decl +#endif + +#if __RANDOM_ITERATOR_TBB_NOEXCEPT_PRESENT +#define __RANDOM_ITERATOR_TBB_NOEXCEPT(expression) noexcept(expression) +#else +#define __RANDOM_ITERATOR_TBB_NOEXCEPT(expression) +#endif + +#include <cstddef> /* Need size_t and ptrdiff_t */ + +#if _MSC_VER + #define __RANDOM_ITERATOR_TBB_tbb_windef_H + #include "internal/_tbb_windef.h" + #undef __RANDOM_ITERATOR_TBB_tbb_windef_H +#endif +#if !defined(_MSC_VER) || _MSC_VER>=1600 + #include <stdint.h> +#endif + +//! Type for an assertion handler +typedef void(*assertion_handler_type)( const char* filename, int line, const char* expression, const char * comment ); + +#if __RANDOM_ITERATOR_TBBMALLOC_BUILD +namespace rml { namespace internal { + #define __RANDOM_ITERATOR_TBB_ASSERT_RELEASE(predicate,message) ((predicate)?((void)0) : rml::internal::assertion_failure(__FILE__,__LINE__,#predicate,message)) +#else +namespace random_iterator_tbb { + #define __RANDOM_ITERATOR_TBB_ASSERT_RELEASE(predicate,message) ((predicate)?((void)0) : tbb::assertion_failure(__FILE__,__LINE__,#predicate,message)) +#endif + + //! Set assertion handler and return previous value of it. + assertion_handler_type __RANDOM_ITERATOR_TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler ); + + //! Process an assertion failure. + /** Normally called from __RANDOM_ITERATOR_TBB_ASSERT macro. + If assertion handler is null, print message for assertion failure and abort. + Otherwise call the assertion handler. */ + void __RANDOM_ITERATOR_TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment ); + +#if __RANDOM_ITERATOR_TBBMALLOC_BUILD +}} // namespace rml::internal +#else +} // namespace random_iterator_tbb +#endif + +#if RANDOM_ITERATOR_TBB_USE_ASSERT + + //! Assert that predicate is true. + /** If predicate is false, print assertion failure message. + If the comment argument is not NULL, it is printed as part of the failure message. + The comment argument has no other effect. */ + #define __RANDOM_ITERATOR_TBB_ASSERT(predicate,message) __RANDOM_ITERATOR_TBB_ASSERT_RELEASE(predicate,message) + + #define __RANDOM_ITERATOR_TBB_ASSERT_EX __RANDOM_ITERATOR_TBB_ASSERT + +#else /* !RANDOM_ITERATOR_TBB_USE_ASSERT */ + + //! No-op version of __RANDOM_ITERATOR_TBB_ASSERT. + #define __RANDOM_ITERATOR_TBB_ASSERT(predicate,comment) ((void)0) + //! "Extended" version is useful to suppress warnings if a variable is only used with an assert + #define __RANDOM_ITERATOR_TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate))) + +#endif /* !RANDOM_ITERATOR_TBB_USE_ASSERT */ + +//! The namespace random_iterator_tbb contains all components of the library. +namespace random_iterator_tbb { + + namespace internal { +#if _MSC_VER && _MSC_VER<1600 + typedef __int8 int8_t; + typedef __int16 int16_t; + typedef __int32 int32_t; + typedef __int64 int64_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; +#else /* Posix */ + using ::int8_t; + using ::int16_t; + using ::int32_t; + using ::int64_t; + using ::uint8_t; + using ::uint16_t; + using ::uint32_t; + using ::uint64_t; +#endif /* Posix */ + } // namespace internal + + using std::size_t; + using std::ptrdiff_t; + +//! The function returns the interface version of the TBB shared library being used. +/** + * The version it returns is determined at runtime, not at compile/link time. + * So it can be different than the value of TBB_INTERFACE_VERSION obtained at compile time. + */ +extern "C" int __RANDOM_ITERATOR_TBB_EXPORTED_FUNC TBB_runtime_interface_version(); + +/** + * @cond INTERNAL + * @brief Identifiers declared inside namespace internal should never be used directly by client code. + */ +namespace internal { + +//! Compile-time constant that is upper bound on cache line/sector size. +/** It should be used only in situations where having a compile-time upper + bound is more useful than a run-time exact answer. + @ingroup memory_allocation */ +const size_t NFS_MaxLineSize = 128; + +/** Label for data that may be accessed from different threads, and that may eventually become wrapped + in a formal atomic type. + + Note that no problems have yet been observed relating to the definition currently being empty, + even if at least "volatile" would seem to be in order to avoid data sometimes temporarily hiding + in a register (although "volatile" as a "poor man's atomic" lacks several other features of a proper + atomic, some of which are now provided instead through specialized functions). + + Note that usage is intentionally compatible with a definition as qualifier "volatile", + both as a way to have the compiler help enforce use of the label and to quickly rule out + one potential issue. + + Note however that, with some architecture/compiler combinations, e.g. on IA-64 architecture, "volatile" + also has non-portable memory semantics that are needlessly expensive for "relaxed" operations. + + Note that this must only be applied to data that will not change bit patterns when cast to/from + an integral type of the same length; tbb::atomic must be used instead for, e.g., floating-point types. + + TODO: apply wherever relevant **/ +#define __RANDOM_ITERATOR_TBB_atomic // intentionally empty, see above + +#if __RANDOM_ITERATOR_TBB_OVERRIDE_PRESENT +#define __RANDOM_ITERATOR_TBB_override override +#else +#define __RANDOM_ITERATOR_TBB_override // formal comment only +#endif + +#if __RANDOM_ITERATOR_TBB_CPP17_FALLTHROUGH_PRESENT +#define __RANDOM_ITERATOR_TBB_fallthrough [[fallthrough]] +#elif __RANDOM_ITERATOR_TBB_FALLTHROUGH_PRESENT +#define __RANDOM_ITERATOR_TBB_fallthrough __attribute__ ((fallthrough)) +#else +#define __RANDOM_ITERATOR_TBB_fallthrough +#endif + +template<class T, size_t S, size_t R> +struct padded_base : T { + char pad[S - R]; +}; +template<class T, size_t S> struct padded_base<T, S, 0> : T {}; + +//! Pads type T to fill out to a multiple of cache line size. +template<class T, size_t S = NFS_MaxLineSize> +struct padded : padded_base<T, S, sizeof(T) % S> {}; + +//! Extended variant of the standard offsetof macro +/** The standard offsetof macro is not sufficient for TBB as it can be used for + POD-types only. The constant 0x1000 (not NULL) is necessary to appease GCC. **/ +#define __RANDOM_ITERATOR_TBB_offsetof(class_name, member_name) \ + ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000) + +//! Returns address of the object containing a member with the given name and address +#define __RANDOM_ITERATOR_TBB_get_object_ref(class_name, member_name, member_addr) \ + (*reinterpret_cast<class_name*>((char*)member_addr - __RANDOM_ITERATOR_TBB_offsetof(class_name, member_name))) + +//! Throws std::runtime_error with what() returning error_code description prefixed with aux_info +void __RANDOM_ITERATOR_TBB_EXPORTED_FUNC handle_perror( int error_code, const char* aux_info ); + +#if RANDOM_ITERATOR_TBB_USE_EXCEPTIONS + #define __RANDOM_ITERATOR_TBB_TRY try + #define __RANDOM_ITERATOR_TBB_CATCH(e) catch(e) + #define __RANDOM_ITERATOR_TBB_THROW(e) throw e + #define __RANDOM_ITERATOR_TBB_RETHROW() throw +#else /* !RANDOM_ITERATOR_TBB_USE_EXCEPTIONS */ + inline bool __RANDOM_ITERATOR_TBB_false() { return false; } + #define __RANDOM_ITERATOR_TBB_TRY + #define __RANDOM_ITERATOR_TBB_CATCH(e) if ( tbb::internal::__RANDOM_ITERATOR_TBB_false() ) + #define __RANDOM_ITERATOR_TBB_THROW(e) tbb::internal::suppress_unused_warning(e) + #define __RANDOM_ITERATOR_TBB_RETHROW() ((void)0) +#endif /* !RANDOM_ITERATOR_TBB_USE_EXCEPTIONS */ + +//! Report a runtime warning. +void __RANDOM_ITERATOR_TBB_EXPORTED_FUNC runtime_warning( const char* format, ... ); + +#if RANDOM_ITERATOR_TBB_USE_ASSERT +static void* const poisoned_ptr = reinterpret_cast<void*>(-1); + +//! Set p to invalid pointer value. +// Also works for regular (non-__RANDOM_ITERATOR_TBB_atomic) pointers. +template<typename T> +inline void poison_pointer( T* __RANDOM_ITERATOR_TBB_atomic & p ) { p = reinterpret_cast<T*>(poisoned_ptr); } + +/** Expected to be used in assertions only, thus no empty form is defined. **/ +template<typename T> +inline bool is_poisoned( T* p ) { return p == reinterpret_cast<T*>(poisoned_ptr); } +#else +template<typename T> +inline void poison_pointer( T* __RANDOM_ITERATOR_TBB_atomic & ) {/*do nothing*/} +#endif /* !RANDOM_ITERATOR_TBB_USE_ASSERT */ + +//! Cast between unrelated pointer types. +/** This method should be used sparingly as a last resort for dealing with + situations that inherently break strict ISO C++ aliasing rules. */ +// T is a pointer type because it will be explicitly provided by the programmer as a template argument; +// U is a referent type to enable the compiler to check that "ptr" is a pointer, deducing U in the process. +template<typename T, typename U> +inline T punned_cast( U* ptr ) { + uintptr_t x = reinterpret_cast<uintptr_t>(ptr); + return reinterpret_cast<T>(x); +} + +#if __RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT + +//! Base class for types that should not be assigned. +class no_assign { +public: + void operator=( const no_assign& ) = delete; + no_assign( const no_assign& ) = default; + no_assign() = default; +}; + +//! Base class for types that should not be copied or assigned. +class no_copy: no_assign { +public: + no_copy( const no_copy& ) = delete; + no_copy() = default; +}; + +#else /*__RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT*/ + +//! Base class for types that should not be assigned. +class no_assign { + // Deny assignment + void operator=( const no_assign& ); +public: +#if __GNUC__ + //! Explicitly define default construction, because otherwise gcc issues gratuitous warning. + no_assign() {} +#endif /* __GNUC__ */ +}; + +//! Base class for types that should not be copied or assigned. +class no_copy: no_assign { + //! Deny copy construction + no_copy( const no_copy& ); +public: + //! Allow default construction + no_copy() {} +}; + +#endif /*__RANDOM_ITERATOR_TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT*/ + +#if TBB_DEPRECATED_MUTEX_COPYING +class mutex_copy_deprecated_and_disabled {}; +#else +// By default various implementations of mutexes are not copy constructible +// and not copy assignable. +class mutex_copy_deprecated_and_disabled : no_copy {}; +#endif + +//! A function to check if passed in pointer is aligned on a specific border +template<typename T> +inline bool is_aligned(T* pointer, uintptr_t alignment) { + return 0==((uintptr_t)pointer & (alignment-1)); +} + +//! A function to check if passed integer is a power of 2 +template<typename integer_type> +inline bool is_power_of_two(integer_type arg) { + return arg && (0 == (arg & (arg - 1))); +} + +//! A function to compute arg modulo divisor where divisor is a power of 2. +template<typename argument_integer_type, typename divisor_integer_type> +inline argument_integer_type modulo_power_of_two(argument_integer_type arg, divisor_integer_type divisor) { + __RANDOM_ITERATOR_TBB_ASSERT( is_power_of_two(divisor), "Divisor should be a power of two" ); + return (arg & (divisor - 1)); +} + + +//! A function to determine if arg is a power of 2 at least as big as another power of 2. +// i.e. for strictly positive i and j, with j being a power of 2, +// determines whether i==j<<k for some nonnegative k (so i==j yields true). +template<typename argument_integer_type, typename power2_integer_type> +inline bool is_power_of_two_at_least(argument_integer_type arg, power2_integer_type power2) { + __RANDOM_ITERATOR_TBB_ASSERT( is_power_of_two(power2), "Divisor should be a power of two" ); + return 0 == (arg & (arg - power2)); +} + +//! Utility template function to prevent "unused" warnings by various compilers. +template<typename T1> void suppress_unused_warning( const T1& ) {} +template<typename T1, typename T2> void suppress_unused_warning( const T1&, const T2& ) {} +template<typename T1, typename T2, typename T3> void suppress_unused_warning( const T1&, const T2&, const T3& ) {} + +// Struct to be used as a version tag for inline functions. +/** Version tag can be necessary to prevent loader on Linux from using the wrong + symbol in debug builds (when inline functions are compiled as out-of-line). **/ +struct version_tag_v3 {}; + +typedef version_tag_v3 version_tag; + +} // internal + +//! Dummy type that distinguishes splitting constructor from copy constructor. +/** + * See description of parallel_for and parallel_reduce for example usages. + * @ingroup algorithms + */ +class split { +}; + +//! Type enables transmission of splitting proportion from partitioners to range objects +/** + * In order to make use of such facility Range objects must implement + * splitting constructor with this type passed and initialize static + * constant boolean field 'is_splittable_in_proportion' with the value + * of 'true' + */ +class proportional_split: internal::no_assign { +public: + proportional_split(size_t _left = 1, size_t _right = 1) : my_left(_left), my_right(_right) { } + + size_t left() const { return my_left; } + size_t right() const { return my_right; } + + // used when range does not support proportional split + operator split() const { return split(); } + +#if __RANDOM_ITERATOR_TBB_ENABLE_RANGE_FEEDBACK + void set_proportion(size_t _left, size_t _right) { + my_left = _left; + my_right = _right; + } +#endif +private: + size_t my_left, my_right; +}; + +} // tbb + +// Following is a set of classes and functions typically used in compile-time "metaprogramming". +// TODO: move all that to a separate header + +#if __RANDOM_ITERATOR_TBB_CPP11_SMART_POINTERS_PRESENT +#include <memory> // for unique_ptr +#endif + +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT || __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT || _LIBCPP_VERSION +#include <utility> // for std::move, std::forward, std::declval +#endif + +namespace random_iterator_tbb { +namespace internal { + +#if __RANDOM_ITERATOR_TBB_CPP11_SMART_POINTERS_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT && __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT + template<typename T, typename... Args> + std::unique_ptr<T> make_unique(Args&&... args) { + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); + } +#endif + +//! Class for determining type of std::allocator<T>::value_type. +template<typename T> +struct allocator_type { + typedef T value_type; +}; + +#if _MSC_VER +//! Microsoft std::allocator has non-standard extension that strips const from a type. +template<typename T> +struct allocator_type<const T> { + typedef T value_type; +}; +#endif + +// Ad-hoc implementation of true_type & false_type +// Intended strictly for internal use! For public APIs (traits etc), use C++11 analogues. +template <bool v> +struct bool_constant { + static /*constexpr*/ const bool value = v; +}; +typedef bool_constant<true> true_type; +typedef bool_constant<false> false_type; + +//! A template to select either 32-bit or 64-bit constant as compile time, depending on machine word size. +template <unsigned u, unsigned long long ull > +struct select_size_t_constant { + //Explicit cast is needed to avoid compiler warnings about possible truncation. + //The value of the right size, which is selected by ?:, is anyway not truncated or promoted. + static const size_t value = (size_t)((sizeof(size_t)==sizeof(u)) ? u : ull); +}; + +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT +using std::move; +using std::forward; +#elif defined(_LIBCPP_NAMESPACE) +// libc++ defines "pre-C++11 move and forward" similarly to ours; use it to avoid name conflicts in some cases. +using std::_LIBCPP_NAMESPACE::move; +using std::_LIBCPP_NAMESPACE::forward; +#else +// It is assumed that cv qualifiers, if any, are part of the deduced type. +template <typename T> +T& move( T& x ) { return x; } +template <typename T> +T& forward( T& x ) { return x; } +#endif /* __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT */ + +// Helper macros to simplify writing templates working with both C++03 and C++11. +#if __RANDOM_ITERATOR_TBB_CPP11_RVALUE_REF_PRESENT +#define __RANDOM_ITERATOR_TBB_FORWARDING_REF(A) A&& +#else +// It is assumed that cv qualifiers, if any, are part of a deduced type. +// Thus this macro should not be used in public interfaces. +#define __RANDOM_ITERATOR_TBB_FORWARDING_REF(A) A& +#endif +#if __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT +#define __RANDOM_ITERATOR_TBB_PARAMETER_PACK ... +#define __RANDOM_ITERATOR_TBB_PACK_EXPANSION(A) A... +#else +#define __RANDOM_ITERATOR_TBB_PARAMETER_PACK +#define __RANDOM_ITERATOR_TBB_PACK_EXPANSION(A) A +#endif /* __RANDOM_ITERATOR_TBB_CPP11_VARIADIC_TEMPLATES_PRESENT */ + +#if __RANDOM_ITERATOR_TBB_CPP11_DECLTYPE_PRESENT +#if __RANDOM_ITERATOR_TBB_CPP11_DECLVAL_BROKEN +// Ad-hoc implementation of std::declval +template <class T> __RANDOM_ITERATOR_TBB_FORWARDING_REF(T) declval() /*noexcept*/; +#else +using std::declval; +#endif +#endif + +template <bool condition> +struct STATIC_ASSERTION_FAILED; + +template <> +struct STATIC_ASSERTION_FAILED<false> { enum {value=1};}; + +template<> +struct STATIC_ASSERTION_FAILED<true>; //intentionally left undefined to cause compile time error + +//! @endcond +}} // namespace random_iterator_tbb::internal + +#if __RANDOM_ITERATOR_TBB_STATIC_ASSERT_PRESENT +#define __RANDOM_ITERATOR_TBB_STATIC_ASSERT(condition,msg) static_assert(condition,msg) +#else +//please note condition is intentionally inverted to get a bit more understandable error msg +#define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_IMPL1(condition,msg,line) \ + enum {static_assert_on_line_##line = tbb::internal::STATIC_ASSERTION_FAILED<!(condition)>::value} + +#define __RANDOM_ITERATOR_TBB_STATIC_ASSERT_IMPL(condition,msg,line) __RANDOM_ITERATOR_TBB_STATIC_ASSERT_IMPL1(condition,msg,line) +//! Verify condition, at compile time +#define __RANDOM_ITERATOR_TBB_STATIC_ASSERT(condition,msg) __RANDOM_ITERATOR_TBB_STATIC_ASSERT_IMPL(condition,msg,__LINE__) +#endif + +#endif /* RC_INVOKED */ +#endif /* __RANDOM_ITERATOR_TBB_tbb_stddef_H */ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..b98b3b8 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,32 @@ +project(tests) + + + #---------------------------- + + message(STATUS "Adding target to tests. Executable file name: benchmark_engine") + + add_executable( benchmark_engine benchmark_engine.cpp ) + + target_link_libraries( benchmark_engine -L/usr/lib64 ${TESTU01_LIBRARIES} ) + + add_dependencies(tests benchmark_engine ) + + #---------------------------- + + message(STATUS "Adding target to tests. Executable file name: benchmark_stream") + + add_executable( benchmark_stream benchmark_stream.cpp ) + + target_link_libraries( benchmark_stream -L/usr/lib64 ${TESTU01_LIBRARIES} ) + + add_dependencies(tests benchmark_stream ) + + #---------------------------- + + message(STATUS "Adding target to tests. Executable file name: benchmark_") + + add_executable( testing testing.cpp ) + + target_link_libraries( testing -L/usr/lib64 ${TESTU01_LIBRARIES} ) + + add_dependencies(tests testing ) \ No newline at end of file diff --git a/tests/benchmark_engine.cpp b/tests/benchmark_engine.cpp new file mode 100644 index 0000000..84e9cec --- /dev/null +++ b/tests/benchmark_engine.cpp @@ -0,0 +1,292 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * benchmark_engine.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file +#define CATCH_CONFIG_ENABLE_BENCHMARKING +#include <catch.hpp> + +#include <cstdio> +#include <cstdint> + +//hydra +#include <random_iterator/Stream.hpp> +#include <random> + +//set a global seed +static const uint64_t default_seed= 0x548c9decbce65295 ; + +TEST_CASE("Performance of counter based PRNGs and corresponding iterators") { + + + random_iterator::squares3 RNG_squares3(default_seed); + random_iterator::squares4 RNG_squares4(default_seed); + random_iterator::threefry RNG_threefry(default_seed); + random_iterator::philox RNG_philox(default_seed); + std::mt19937 RNG_mt19937(default_seed ); + std::ranlux48 RNG_ranlux48(default_seed); + + SECTION( "Benchmarks: RNG::operator()" ){ + + + BENCHMARK("random_iterator::squares3") { + return RNG_squares3(); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4(); + }; + + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry(); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox(); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937(); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48(); + }; + } + + + SECTION( "Benchmarks: RNG::discard(1)" ) + { + + static uint32_t jump_size=1; + + BENCHMARK("random_iterator::squares3") { + RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + SECTION( "Benchmarks: RNG::discard(10)" ) + { + static uint32_t jump_size=10; + + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + + SECTION( "Benchmarks: RNG::discard(100)" ) + { + static uint32_t jump_size=100; + + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + SECTION( "Benchmarks: RNG::discard(1000)" ) + { + static uint32_t jump_size=1000; + + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + + SECTION( "Benchmarks: RNG::discard(10000)" ) + { + static uint32_t jump_size=10000; + + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + + } + + + SECTION( "Benchmarks: RNG::discard(100000)" ) + { + static uint32_t jump_size=100000; + + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + + SECTION( "Benchmarks: RNG::discard(1000000)" ) + { + static uint32_t jump_size=1000000; + + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } +} + diff --git a/tests/benchmark_stream.cpp b/tests/benchmark_stream.cpp new file mode 100644 index 0000000..387217b --- /dev/null +++ b/tests/benchmark_stream.cpp @@ -0,0 +1,170 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * benchmark_stream.hpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file +#define CATCH_CONFIG_ENABLE_BENCHMARKING +#include <catch.hpp> + +#include <cstdio> +#include <cstdint> + +//hydra +#include <random_iterator/Stream.hpp> +#include <random> + +//set a global seed +static const uint64_t default_seed= 0x548c9decbce65295 ; + +TEST_CASE("Performance of counter based PRNGs and corresponding iterators") { + + + random_iterator::squares3 RNG_squares3(default_seed); + random_iterator::squares4 RNG_squares4(default_seed); + random_iterator::threefry RNG_threefry(default_seed); + random_iterator::philox RNG_philox(default_seed); + std::mt19937_64 RNG_mt19937(default_seed ); + std::ranlux48 RNG_ranlux48(default_seed); + + std::uniform_real_distribution<double> dist(0.0, 1.0); + + auto squares3_stream = random_iterator::make_stream( dist, RNG_squares3 , 1 ); + auto squares4_stream = random_iterator::make_stream( dist, RNG_squares4 , 1 ); + auto threefry_stream = random_iterator::make_stream( dist, RNG_threefry , 1 ); + auto philox_stream = random_iterator::make_stream( dist, RNG_philox , 1 ); + + auto squares3_it = squares3_stream.begin(); + auto squares4_it = squares4_stream.begin(); + auto threefry_it = threefry_stream.begin(); + auto philox_it = philox_stream.begin(); + + + + SECTION( "Benchmarks: RNG::operator()" ){ + + BENCHMARK("random_iterator::squares3") { + return squares3_stream(); + }; + + BENCHMARK("random_iterator::squares4") { + return squares4_stream(); + }; + + BENCHMARK("random_iterator::threefry") { + return threefry_stream(); + }; + + BENCHMARK("random_iterator::philox") { + return philox_stream(); + }; + + } + + + SECTION( "Benchmarks: RNG::operator()++" ) + { + + BENCHMARK("random_iterator::squares3") { + return *(squares3_it++); + }; + + BENCHMARK("random_iterator::squares4") { + return *(squares4_it++); + }; + + BENCHMARK("random_iterator::threefry") { + return *(threefry_it++); + }; + + BENCHMARK("random_iterator::philox") { + return *(philox_it++); + }; + + } + + SECTION( "Benchmarks: RNG::operator[]" ) + { + + BENCHMARK("random_iterator::squares3") { + return squares3_it[10]; + }; + + BENCHMARK("random_iterator::squares4") { + return squares4_it[10]; + }; + + BENCHMARK("random_iterator::threefry") { + return threefry_it[10]; + }; + + BENCHMARK("random_iterator::philox") { + return philox_it[10]; + }; + + } + + SECTION( "Benchmarks: RNG::operator[]" ) + { + + BENCHMARK("random_iterator::squares3") { + return squares3_stream[10]; + }; + + BENCHMARK("random_iterator::squares4") { + return squares4_stream[10]; + }; + + BENCHMARK("random_iterator::threefry") { + return threefry_stream[10]; + }; + + BENCHMARK("random_iterator::philox") { + return philox_stream[10]; + }; + + } + SECTION( "Benchmarks: std" ) + { +/* + BENCHMARK("random_iterator::squares3") { + RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; +*/ + + BENCHMARK("std::mt19937_64") { + return dist(RNG_mt19937); + }; + + BENCHMARK("std::ranlux48") { + return dist(RNG_ranlux48); + }; + + } +} diff --git a/tests/testing.cpp b/tests/testing.cpp new file mode 100644 index 0000000..c04609d --- /dev/null +++ b/tests/testing.cpp @@ -0,0 +1,296 @@ +/*---------------------------------------------------------------------------- + * + * Copyright (C) 2021 Antonio Augusto Alves Junior + * + * This file is part of RandomIterator. + * + * RandomIterator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * RandomIterator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with RandomIterator. If not, see <http://www.gnu.org/licenses/>. + * + *---------------------------------------------------------------------------*/ +/* + * testing.cpp + * + * Created on: 25/02/2021 + * Author: Antonio Augusto Alves Junior + */ + + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file +#define CATCH_CONFIG_ENABLE_BENCHMARKING +#include <make catch.hpp> + +#include <cstdio> +#include <cstdint> + +//hydra +#include <random_iterator/Stream.hpp> +#include <random> + +//set a global seed +static const uint64_t default_seed= 0x548c9decbce65295 ; + +TEST_CASE("Performance of counter based PRNGs and corresponding iterators") { + + + //random_iterator::squares3 RNG_squares3(default_seed); + //random_iterator::squares4 RNG_squares4(default_seed); + random_iterator::threefry RNG_threefry(default_seed); + random_iterator::philox RNG_philox(default_seed); + std::mt19937 RNG_mt19937(default_seed ); + std::ranlux48 RNG_ranlux48(default_seed); + + SECTION( "Benchmarks: RNG::operator()" ){ + + /* + BENCHMARK("random_iterator::squares3") { + return RNG_squares3(); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4(); + }; + */ + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry(); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox(); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937(); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48(); + }; + } + + + SECTION( "Benchmarks: RNG::discard(1)" ) + { + + static uint32_t jump_size=1; +/* + BENCHMARK("random_iterator::squares3") { + RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; +*/ + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + SECTION( "Benchmarks: RNG::discard(10)" ) + { + static uint32_t jump_size=10; +/* + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; +*/ + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + + SECTION( "Benchmarks: RNG::discard(100)" ) + { + static uint32_t jump_size=100; +/* + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; +*/ + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + SECTION( "Benchmarks: RNG::discard(1000)" ) + { + static uint32_t jump_size=1000; +/* + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; +*/ + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + + SECTION( "Benchmarks: RNG::discard(10000)" ) + { + static uint32_t jump_size=10000; +/* + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; +*/ + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + + } + + + SECTION( "Benchmarks: RNG::discard(100000)" ) + { + static uint32_t jump_size=100000; +/* + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; +*/ + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } + + + SECTION( "Benchmarks: RNG::discard(1000000)" ) + { + static uint32_t jump_size=1000000; +/* + BENCHMARK("random_iterator::squares3") { + return RNG_squares3.discard(jump_size); + }; + + BENCHMARK("random_iterator::squares4") { + return RNG_squares4.discard(jump_size); + }; +*/ + + BENCHMARK("random_iterator::threefry") { + return RNG_threefry.discard(jump_size); + }; + + BENCHMARK("random_iterator::philox") { + return RNG_philox.discard(jump_size); + }; + + BENCHMARK("std::mt19937") { + return RNG_mt19937.discard(jump_size); + }; + + BENCHMARK("std::ranlux48") { + return RNG_ranlux48.discard(jump_size); + }; + } +} -- GitLab